SQL索引學習筆記

2021-10-06 23:09:40 字數 2826 閱讀 3080

聚集索引

優秀的索引

索引(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的覆蓋索引。

盡量使用覆蓋索引,因為能加快查詢速度。

回表操作:

根據前面提到的innodb引擎

根據非主鍵索引查出主鍵後,再根據主鍵索引查詢行記錄的操作為回表操作。

假設表有:

主鍵索引

非主鍵索引name聯合索引name, phone

則:select * from user where name = 'mervyn'觸發回表操作,通過非主鍵索引name查詢出id後, 又根據主鍵索引查出行資料。

select id, name from user where name = 'mervyn'沒有觸發回表操作,通過非主鍵索引name可以直接查詢出idname

select id, phone, name from user where name = 'mervyn'沒有觸發回表操作,聯合索引

where後匹配的索引關鍵字列越多越好,掃瞄的資料越精確,越少越好。

避免再次排序。

盡可能的應用覆蓋索引。減少回表操作。

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合起來使用,索引一些如文章正文等不需要恢復的文件 此時內...