通過例項理解單列索引、多列索引以及最左字首原則
例項:現在我們想查出滿足以下條件的使用者id:
mysql>select `uid` from people where lname`='liu' and `fname`='zhiqun' and `age`=26
因為我們不想掃瞄整表,故考慮用索引。
1.單列索引:
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子句中使用最頻繁的一列放在最左邊。
索引最左字首原則
今天在觀察慢sql統計的時候,發現了乙個sql的平均耗時長,而且總的掃瞄行數大,分析對應表的ddl,發現此表中只有乙個唯一索引index1 a,b,c 但是在查詢條件中沒有帶上a欄位,導致這個查詢sql沒有走索引,從而導致了全表掃瞄。這裡涉及到乙個索引最左字首原則,我們來一起看一下。下述摘自 通常我...
通過例項理解單列索引 多列索引以及最左字首原則
我們想查出滿足以下條件的使用者id select uid from people where lname liu and fname zhiqun and age 26 因為我們不想掃瞄整表,故考慮用索引。alter table people add index lname lname 將lname...
聯合索引和最左字首原則
1 也稱多列索引 復合索引。2 聯合索引就是把多個列按照順序放到乙個索引樹上。3 乙個索引上最多可以建16列。4 聯合索引可以看成排好序的陣列。排序規則是 先按照第乙個列進行排序,第二列再按照第一列排好序的基礎上再進行排序,依次類推 5 需要按照最左字首原則才能生效 最左字首原則 按照最左邊的列開始...