MySql最左字首原則

2021-10-01 08:47:11 字數 1511 閱讀 5929

最左字首原則

通過例項理解單列索引、多列索引以及最左字首原則

例項:現在我們想查出滿足以下條件的使用者id: 

mysql>select `uid` from people where lname`=』liu』 and `fname`=』zhiqun』 and `age`=26 

因為我們不想掃瞄整表,故考慮用索引。

單列索引: 

alter table people add index lname (lname); 

將lname列建索引,這樣就把範圍限制在lname=』liu』的結果集1上,之後掃瞄結果集1,產生滿足fname=』zhiqun』的結果集2,再掃瞄結果集2,找到 age=26的結果集3,即最終結果。

由 於建立了lname列的索引,與執行表的完全掃瞄相比,效率提高了很多,但我們要求掃瞄的記錄數量仍舊遠遠超過了實際所需 要的。雖然我們可以刪除lname列上的索引,再建立fname或者age 列的索引,但是,不論在哪個列上建立索引搜尋效率仍舊相似。

2.多列索引: 

alter table people add index lname_fname_age (lame,fname,age); 

為了提高搜尋效率,我們需要考慮運用多列索引,由於索引檔案以b-tree格式儲存,所以我們不用掃瞄任何記錄,即可得到最終結果。

注:在mysql中執行查詢時,只能使用乙個索引,如果我們在lname,fname,age上分別建索引,執行查詢時,只能使用乙個索引,mysql會選擇乙個最嚴格(獲得結果集記錄數最少)的索引。

3.最左字首:顧名思義,就是最左優先,上例中我們建立了lname_fname_age多列索引,相當於建立了(lname)單列索引,(lname,fname)組合索引以及(lname,fname,age)組合索引。

注:在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊。

拓展:在網上看到乙個關於最左字首原則提出這麼乙個例子。

多列欄位做索引,state/city/zipcode,想要索引生效的話,只能使用如下的組合 

state/city/zipcode 

state/city 

state 

其他方式(如city,city/zipcode),則索引不會生效 

這種現象是怎麼導致的?和索引的儲存方式有關嗎?

例如你這個聯合索引是state/city/zipcode

那麼state就是第一關 city是第二關, zipcode就是第三關

你必須匹配了第一關,才能匹配第二關,匹配了第一關和第二關,才能匹配第三關

你不能直接到第二關的

索引的格式就是第一層是state,第二層才是city

索引是因為b+樹結構 所以查詢快 如果單看第三列 是非排序的。 

多列索引是先按照第一列進行排序,然後在第一列排好序的基礎上再對第二列排序,如果沒有第一列的話,直接訪問第二列,那第二列肯定是無序的,直接訪問後面的列就用不到索引了。 

所以如果不是在前面列的基礎上而是但看後面某一列,索引是失效的。大家有不同的觀點可以提出,這是個人理解的觀點。

MySql最左字首原則

企業的筆試題,對資料庫這塊了解很淺,所以還是記錄一下吧。b tree 索引和 hash 索引的對比 對於 b tree 和 hash 資料結構的理解能夠有助於 不同儲存引擎下使用不同索引的查詢效能的差異,尤其是那些允許你選擇 b tree 或者 hash 索引的記憶體儲存引擎。b tree 索引的特...

mysql最左字首原則

假設資料 表 t a,b,c rowid 為物理位置 rowid a b c 1 111 2 2 113 3 2214 4 1 33 5 2312 6 1 25 7 239 8 1 22 9 136 10 2 211 11 228 12 1 17 13 2315 14 1 14 15 2110 當你...

最左字首原則

當b 樹的資料項是復合的資料結構,比如 name,age,的時候,b 數是按照從左到右的順序來建立搜尋樹的,比如當 張三,20,f 這樣的資料來檢索的時候,b 樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和 最後得到檢索的資料 但當 20,f 這樣的沒有name的資料...