mysql最左字首原則

2021-10-01 13:45:29 字數 2051 閱讀 4130

假設資料 表 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

當你建立乙個索引 create index *** on t(a,b),則索引檔案邏輯上等同於如下

a b rowid

1 1 1

1 1 12

1 1 14

1 2 6

1 2 8

1 3 4

1 3 9

2 1 2

2 1 15

2 2 3

2 2 10

2 2 11

2 3 5

2 3 7

2 3 13

當 select * from t where a = 1 and b = 3 的時候, 資料庫系統可以直接從索引檔案中直接二分法找到 a = 1 的記錄,然後再 b = 3 的記錄

但如果你 where b = 3 則需要遍歷這個索引表的全部

mysql 建立多列索引(聯合索引)有最左字首的原則,即最左優先,如:

如果有乙個 2 列的索引 (col1, col2),則已經對 (col1)、(col1, col2) 上建立了索引;

如果有乙個 3 列索引 (col1, col2, col3),則已經對 (col1)、(col1, col2)、(col1, col2, col3) 上建立了索引;

如果建的索引是 (name, cid)。而查詢的語句是 cid=1 and name=』小紅』。為什麼還能利用到索引?

當按照索引中所有列進行精確匹配(「=」 或 「in」)時,索引可以被用到,並且 type 為 const。理論上索引對順序是敏感的,但是由於 mysql 的查詢優化器會自動調整 where 子句的條件順序以使用適合的索引,所以 mysql 不存在 where 子句的順序問題而造成索引失效

範圍查詢

mysql 會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配。範圍列可以用到索引,但是範圍列後面的列無法用到索引。即,索引最多用於乙個範圍列,因此如果查詢條件中有兩個範圍列則無法全用到索引

like 語句的索引問題

如果萬用字元 % 不出現在開頭,則可以用到索引,但根據具體情況不同可能只會用其中乙個字首

在 like 「value%」 可以使用索引,但是 like 「%value%」 不會使用索引,走的是全表掃瞄

不要在列上進行運算

如果查詢條件中含有函式或表示式,將導致索引失效而進行全表掃瞄

例如 select * from user where year(birthday) < 1990

可以改造成 select * from users where birthday <』1990-01-01′

索引不會包含有 null 值的列

只要列中包含有 null 值都將不會被包含在索引中,復合索引中只要有一列含有 null 值,那麼這一列對於此復合索引就是無效的。所以在資料庫設計時不要讓字段的預設值為 null

盡量選擇區分度高的列作為索引,區分度的公式是 count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少,唯一鍵的區分度是 1,而一些狀態、性別字段可能在大資料面前區分度就是 0。一般需要 join 的字段都要求區分度 0.1 以上,即平均 1 條掃瞄 10 條記錄

覆蓋索引的好處

如果乙個索引包含所有需要的查詢的字段的值,我們稱之為覆蓋索引。覆蓋索引是非常有用的工具,能夠極大的提高效能。因為,只需要讀取索引,而無需讀表,極大減少資料訪問量

MySql最左字首原則

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

MySql最左字首原則

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

最左字首原則

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