通過例項理解單列索引、多列索引以及最左字首原則
例項:現在我們想查出滿足以下條件的使用者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+樹結構 所以查詢快 如果單看第三列 是非排序的。
多列索引是先按照第一列進行排序,然後在第一列排好序的基礎上再對第二列排序,如果沒有第一列的話,直接訪問第二列,那第二列肯定是無序的,直接訪問後面的列就用不到索引了
sql優化
mysql 只能最左字首嗎 mysql最左字首原則
假設我們要查詢以下sql語句,如果沒有索引我們就會掃瞄整張物理表 select uid from people where lname liu and fname zhiqun and age 26 假設建有單列索引index lname 那麼系統就會先到lname索引表中查詢得到符合條件的peop...
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也可以使用這個索引。這個索引可以用於如...