mysql 只能最左字首嗎 mysql最左字首原則

2021-10-17 18:16:18 字數 2234 閱讀 6957

假設我們要查詢以下sql語句,如果沒有索引我們就會掃瞄整張物理表

select `uid` from people where lname`='liu' and `fname`='zhiqun' and `age`=26

假設建有單列索引index(lname),那麼系統就會先到lname索引表中查詢得到符合條件的people主鍵值,然後通過主鍵值掃瞄people表,進行剩下的匹配,這樣就大大地提高效率。

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

索引的最左字首原理:

通常我們在建立聯合索引的時候,也就是對多個字段建立索引,相信建立過索引的同學們會發現,無論是oralce還是mysql都會讓我們選擇索引的順序,比如我們想在a,b,c三個欄位上建立乙個聯合索引,我們可以選擇自己想要的優先順序,a、b、c,或者是b、a、c 或者是c、a、b等順序。為什麼資料庫會讓我們選擇欄位的順序呢?不都是三個欄位的聯合索引麼?這裡就引出了資料庫索引的最左字首原理。

比如:索引index1:(a,b,c)有三個字段,我們在使用sql語句來查詢的時候,會發現很多情況下不按照我們想象的來走索引。比如以下兩種情況

select * from table where c = '1'

select * from table where b =『1』 and c ='2'

以下三種會走索引

select * from table where a = '1'select * from table where a = '1' and b = 『2』select * from table where a = '1' and b = 『2』  and c='3'

從以上兩個**組可知看出,所有走索引index1的sql語句的查詢條件裡面都帶有a欄位,那麼問題來了,index1的索引的最左邊的列字段是a,是不是查詢條件中包含a就會走索引呢?例如:

select * from table where a = '1' and c= 『2』

按照之前的理解,包含a欄位,會走索引,但是是不是所有欄位都走了索引呢?

我們來做個實驗:

我這裡有乙個表

接下來測試之前的語句:

explain select * from indextest where a = 2 and c = "豔 耀 董"

這一句sql就相當於之前的select * from table where a = '1' and c= 『2』這個sql語句了,我們來看看解釋計畫:

可以看到走了索引prinidandorder,但是旁邊的key_len=303,但道理key_len應該是大於303的,為什麼呢?

這也是最左字首原理的一部分,索引index1:(a,b,c),只會走a、a,b、a,b,c 三種型別的查詢,其實這裡說的有一點問題,a,c也走,但是只走a欄位索引,不會走c欄位。

另外還有乙個特殊情況說明下,select * from table where a = '1' and b > 『2』  and c='3' 這種型別的也只會有 a與b 走索引,c不會走。

像select * from table where a = '1' and b > 『2』  and c='3' 這種型別的sql語句,在a、b走完索引後,c肯定是無序了,所以c就沒法走索引,資料庫會覺得還不如全表掃瞄c欄位來的快。不知道我說明白沒,感覺這一塊說的始終有點牽強。

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

最左側規範

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

最左字首是什麼?

最左字首是針對組合索引而言的,那麼組合索引有什麼好處?

以index (a,b,c)為例建立這樣的索引相當於建立了索引a、ab、abc三個索引。乙個索引頂三個索引當然是好事,畢竟每多乙個索引,都會增加寫操作的開銷和磁碟空間的開銷。

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

mysql 只能最左字首嗎 MySQL最左字首原則

通過例項理解單列索引 多列索引以及最左字首原則 例項 現在我們想查出滿足以下條件的使用者id mysql select uid from people where lname liu and fname zhiqun and age 26 因為我們不想掃瞄整表,故考慮用索引。單列索引 alter t...

mysql最左字首 mysql索引之最左字首法則

1 最左字首法則 如果你的索引有多個字段,如圖1所示,索引欄位有 kq time,card no,kq type這三個字段 最左字首就是按這三個欄位的前後順序進行排序的 如果是三個查詢條件中三個欄位都用到了,如圖二 嚴格按照最左字首原則,查詢條件順序是使用了三個字段 kq time,card no,...

mysql中索引最左字首 索引最左字首匹配原則

如果索引字串的前面n個字元都不相同,那麼最好不要索引整個資料列,二十索引前n個字元,這樣可以節省大量空間。如果在資料列a,b,c上建立了復合索引,索引中的資料行按照a b c次序排列,因此資料表會自動的按照a b和a排列,即使指定了a,或者a和b的值,mysql也可以使用這個索引。這個索引可以用於如...