索引是資料庫中對資料查詢/檢索的一種優化方案。
主要有hash索引和b+ tree兩種資料結構。
mysql預設的innodb引擎中,預設的是b+ tree。hash索引底層是hash表,hash表以一種鍵值對儲存資料的結構;多個資料在儲存關係上沒有任何順序關係,在區間查詢時候無法直接通過索引查詢,就需要進行全表掃瞄。所以hash索引只能用於等值查詢的場景。其他問題:hash索引無法利用索引完成排序,不支援多列聯合索引的最左匹配規則。存在雜湊碰撞問題。
b+ tree是一種多路平衡查詢樹,他的節點本來就是有序的,所以對於範圍查詢的時候不需要進行全表掃瞄。
b+ 樹的葉子節點可能儲存整行資料,也可能儲存主鍵key的值;
在查詢資料的時候,聚簇索引一般會比非聚簇索引快,因為非聚簇索引查詢資料查到的是主鍵的值,需要通過主鍵的值再對資料表進行一次查詢,稱這種情況為回表。
非主鍵索引也可以通過覆蓋索引避免回表。因為最左匹配原則,我們在建立聯合索引過程中,需要注意按照索引使用的頻繁度高低和數值的離散程度高低按順序從左向右邊排列,如此能夠做到儘量減少因為索引失效而進行順序掃瞄的情況。覆蓋索引(covering index):乙個查詢語句的執行只用從索引中就能夠取得,不必從資料表中讀取。也可以稱之為實現了索引覆蓋。
執行一條查詢語句的時候,如果在索引中就能夠獲得所需要的資料,就不用查到索引後,再回到資料表中操作,減少的i/o,提高了效率。
eg:表covering_index_sample中有乙個普通索引 idx_key1_key2(key1,key2)。
當我們通過sql語句:select key2 from covering_index_sample where key1 = 『keytest』;的時候,就可以通過覆蓋索引查詢到key2並返回,無需回表。
最左匹配原則:where 語句中的條件按照索引建立的字段順序來使用(不代表and條件就必須按照順序來寫),如果中間某列沒有條件,或使用like會導致後面的列不能使用索引。
主要從時間和空間考慮:
空間:索引需要佔物理空間。
mysql 5.6引入了索引下推優化,預設開啟。
使用set optimizer_switch = 『index_condition_pushdown=off』;可以將其關閉。官方文件中給的例子和解釋如下:
people表中(zipcode,lastname,firstname)構成乙個索引select * from people where zipcode=『95054』 and lastname like 『%etrunia%』 and address like 『%main street%』;
如果沒有使用索引下推技術,則mysql會通過zipcode='95054』從儲存引擎中查詢對應的資料,返回到mysql服務端,然後mysql服務端基於lastname like '%etrunia%'和address like '%main street%'來判斷資料是否符合條件。
如果使用了索引下推技術,則mysql首先會返回符合zipcode='95054』的索引,然後根據lastname like '%etrunia%'和address like '%main street%'來判斷索引是否符合條件。如果符合條件,則根據該索引來定位對應的資料,如果不符合,則直接reject掉。有了索引下推優化,可以在有like條件查詢的情況下,減少回表次數。
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
mysql更新索引庫 Mysql資料庫索引增刪改查
一.索引的作用 一般的應用系統,讀寫比例在10 1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重。在資料量和訪問量不大的情況下,mysql訪問是非常快的,是否加索引對訪問影響不大。但是當資料量和訪問量劇增的...
Mysql資料庫的索引
今天看了下mysql資料庫的索引,基本的建立語句就不在贅述了,本文主要寫一些索引調優方面的見解。mysql資料庫的索引是與具體的儲存引擎相關的,想innodb以b tree索引為主,memory則以雜湊索引為主。針對innodb的b tree索引 1 多鍵索引時,要注意鍵的順序,一般來說鍵在越級時,...