1. 程式人生 > >MySQL索引最左原則

MySQL索引最左原則

最終 from ott 選擇 lam otto 根據 組合索引 round

通過實例理解單列索引、多列索引以及最左前綴原則

實例:現在我們想查出滿足以下條件的用戶id:

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 列的索引,但是,不論在哪個列上創建索引搜索效率仍舊相似。

多列索引:

ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);

為了提高搜索效率,我們需要考慮運用多列索引,由於索引文件以B-Tree格式保存,所以我們不用掃描任何記錄,即可得到最終結果。

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

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

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

MySQL索引最左原則