聚集索引
優秀的索引
索引(index)是幫助mysql高效獲取資料的資料結構。
在rdbms中,索引儲存在硬碟中。
ahi
-adaptive hash index
- 自適應雜湊索引
對欄位計算hash值,將hash值和行指標對應存在hash表中。
為什麼innodb
引擎不支援手動使用hash索引:
存在記憶體中,資料量大,記憶體容易爆
hash查詢行記錄,不適合指定查某幾列
按hash值排序,對範圍查詢沒有幫助,如果還有order,需要二次排序
雜湊碰撞,計算出的hash值相同。乙個hash值指向多行指標,需要逐一查詢
memory
引擎可以手動使用hash索引,因為memory
引擎使用記憶體。
一般中間表使用memory
引擎。
乙個節點最多分出兩個節點,子節點滿足左小右大。
缺點:極限情況,假設1為根節點,往下節點依次為2、3、4、5等等,要查詢5需要5次。
乙個節點最多分出兩個節點,兩個子節點的深度差絕對值不能大於1。
io次數過多,隨著資料變多,樹的深度變大。
目標資料過少,造成很大的io資源浪費。
多關鍵數
多路數每條路深度一樣、絕對平衡
每個節點,最多關鍵數的個數 = 路數 - 1。
假設節點為:1,5,10每個節點都有資料區。則分路為
[負無窮,1)
,[1, 5)
,[5,10)
,[10,正無窮)
節點關鍵數和路數1:1。
假設節點為:1,5,10資料區存放在葉子節點,所以所有查詢都要查詢到葉節點,雖然部分查詢比則分路為
[1, 5)
,[5, 10)
,[10, 正無窮)
b-tree
更耗時,但是穩定。
優點:基於索引掃表能力強
基於索引排序能力強
查詢所有資料都要到葉子節點,時間穩定。
取消資料區內容,讀寫能力更強
myi 檔案,存索引,葉節點存位址
myd 檔案,存位址對應的資料
ibd檔案:
innodb引擎中,只有主鍵是聚集索引,其他索引都是非聚集索引。
如果不手動建立主鍵索引,會自動用隱藏列_rowid
作為主鍵索引,占用6byte,而int只占用4byte。
並且行鎖會公升級為表鎖
count distinct col : count col
非重複列數:所有列數
列重複越少越好。
最左匹配原則:聯合索引的任何字首都可啟用聯合索引
create index idx_name_ph_age(name,phone,age)下述兩個查詢是否啟用聯合查詢,使用了幾個:name
name, phone
name, phone, age
以上三個均可啟用聯合索引,而
phone
phone, age
phone, name ,age
等不可啟用聯合索引
where name=『peter』 and phone > 1333333 and age = 18
使用了聯合索引,1個。「範圍之後全失效」
因為phone>1333333範圍過大,而age=18重複率高。
where phone = 1333333 and name = 『peter』
使用聯合索引2個,mysql優化器,會把選擇性最後的列放在where的最左邊。
聯結器:管理連線,許可權驗證不觸發回表操作。分析器:詞法分析,語法分析
優化器:執行計畫生成,索引選擇
執行器:操作引擎,返回結果
通過索引項的資訊可以直接返回鎖查詢的列,則該索引成為查詢sql的覆蓋索引。
盡量使用覆蓋索引,因為能加快查詢速度。
回表操作:where後匹配的索引關鍵字列越多越好,掃瞄的資料越精確,越少越好。根據前面提到的
innodb
引擎根據非主鍵索引查出主鍵後,再根據主鍵索引查詢行記錄的操作為回表操作。
假設表有:
主鍵索引
非主鍵索引
name
聯合索引name, phone
則:
select * from user where name = 'mervyn'
觸發回表操作,通過非主鍵索引name
查詢出id
後, 又根據主鍵索引查出行資料。
select id, name from user where name = 'mervyn'
沒有觸發回表操作,通過非主鍵索引name
可以直接查詢出id
和name
。
select id, phone, name from user where name = 'mervyn'
沒有觸發回表操作,聯合索引
避免再次排序。
盡可能的應用覆蓋索引。減少回表操作。
SQL索引學習 聚集索引
上面兩位朋友的問題有乙個共同特點,就是希望有示例,因為這樣容易讓他們更加容易理解。但從我的角度來講,有示例只能給你提供乙個參考而已,夠不成是否容易消化的關鍵因素,最好的辦法是,通過自己的理解,自己有能力去做相應的實驗,這樣效果才是最好的,你也會發現更多的問題,每個專案都有自己的特點,所以效能優化這塊...
SQL學習(3)索引
create index 索引名 on 表名 列名 建立非聚簇索引 create clustered index 索引名 on 表名 列名 建立聚簇索引 create unique clustered index 索引名 on 表名 列名 建立唯一聚簇索引 通常使用 drop index 表名.索引...
索引學習筆記
一 index屬性介紹 field.store.yes或者no 儲存域選項 yes 將會儲存域值,原始字串的值會儲存在索引中,以此可以進行相應的恢復操作,對於主鍵,標題可以是這種方式儲存 no 不會儲存域值,通常與index.anaylized合起來使用,索引一些如文章正文等不需要恢復的文件 此時內...