索引是儲存引擎中用於快鎖查找記錄的一種數據結構服務器
索引類型數據結構
B-Tree對索引是順序組織存儲的,因此很適合查找範圍數據。
B-Tree索引適用於全鍵值、鍵值範圍或鍵前綴查找。其中鍵前綴查找只適用於根據最左前綴的查找。
適用場景:優化
1. 全值匹配,和索引中的全部列進行匹配。 2. 匹配最左前綴,只能使用索引的第一列 創建channel_id,ref索引,單獨查詢channel_id時能夠用到索引,單獨查詢ref時用不到索引,檢索了所有數據
3. 匹配列前綴,使用LIKE查詢時只能查詢以什麼開頭時才能用到索引,而且只能用到索引第一列 例如創建了name_age(name,age) 的聚合索引,查詢以張字開頭的姓而且年齡爲18的數據時只能用到name索引,而查以輝字結尾的姓別時用不到索引。 創建ref,channel_id的索引,ref使用like查詢時掃描了70萬行,改成等於查詢時掃描了10萬行
4. 匹配範圍值 當索引中列有範圍查找時其後面列也將沒法使用到索引 當channel_id使用範圍查詢時,使用索引檢索了全部大於30的channel_id,可是索引第二列的ref沒有使用索引
- 哈希索引 哈希索引是基於哈希表實現的。(感受使用場景很少,並且只支持Memory引擎表,略過) - 空間數據索引 - 全文索引 用於查找列中關鍵詞,不是直接比較索引中的值。
索引優化spa
- 當服務器出現對多個索引的相交操做一般須要一個包含查詢列的多列索引而不是多個單列索引 - 創建多列索引時將選擇性最高的列放入索引的最左邊。 - 當數據重複性過高時,例如一張大表中有一半數據都包含着某個值,另外一邊包含着另外一個值 這樣的列就沒有創建因此的必要了。
例如圖中channel_id字段在400萬數據中有四分之一都是,就算創建索引每次查詢也會檢索100萬條記錄。 code
- 當某幾個列同時查詢的頻率很高的時候,能夠針對這幾個列創建一個全覆蓋索引。 - 避免重複順序索引的建立,會形成索引冗餘。 建立一個多列索引,兩個單列索引,查詢時會使用多列索引而不是兩個單列索引
- 儘可能把須要範圍查詢的列放入多列索引的右面,便於優化器儘量索引大多數的列。