在查詢條件中必須有復合索引還中最左側的列(在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊)
假設你在表的state、city和zip資料列上建立了復合索引。索引中的資料行按照state/city/zip次序排列,
因此它們也會自動地按照state/city和state次序排列。這意味著,即使你在查詢中只指定了state值,
或者指定state和city值,mysql也可以使用這個索引。因此,這個索引可以被用於搜尋如下所示的資料列組合:
相當於建立以下三個索引:
state, city, zip (順序可以變)
state, city
state
mysql不能利用這個索引來搜尋沒有包含在最左字首的內容。例如,如果你按照city或zip來搜尋,
就不會使用到這個索引。
如果你搜尋給定的state和具體的zip**(索引的1和3列),
該索引也是不能用於這種組合值的,儘管mysql可以利用索引來查詢匹配的state從而縮小搜尋的範圍。
(用explain中看到的extra列=using index condition, 而出現前兩個列的extra列=using index condition)
如果你考慮給已經索引過的表新增索引,那麼就要考慮你將增加的索引是否是已有的多列索引的最左字首。
如果是這樣的,不用增加索引,因為已經有了(例如,如果你在state、city和zip上建立了索引,那麼沒有必要再增加state的索引)。
通過例項理解單列索引、多列索引以及最左字首原則
例項:現在我們想查出滿足以下條件的使用者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 列的索引,但是,不論在哪個列上建立索引搜尋效率仍舊相似。
多列索引:
alter table people add index lname_fname_age (lame,fname,age);
為了提高搜尋效率,我們需要考慮運用多列索引,由於索引檔案以b-tree格式儲存,所以我們不用掃瞄任何記錄,即可得到最終結果。
注:在mysql中執行查詢時,只能使用乙個索引,如果我們在lname,fname,age上分別建索引,執行查詢時,只能使用乙個索引,mysql會選擇乙個最嚴格(獲得結果集記錄數最少)的索引。
二、不建議建立索引
唯一性太差的字段不宜建立索引:如(性別等。)
mysql索引注意事項
1.模糊查詢前導不會走索引 select id,user name,price code from user activity info where user name like zhang 如果非要使用前導索引的話可以借助apache的lucence索引工具 2.欄位預設值不要設定成null 如果...
mysql復合索引注意事項
概念 單一索引是指索引列為一列的情況,即新建索引的語句只實施在一列上 使用者可以在多個列上建立索引,這種索引叫做復合索引 組合索引 復合索引在資料庫操作期間所需的開銷更小,可以代替多個單一索引 同時有兩個概念叫做窄索引和寬索引,窄索引是指索引列為1 2列的索引,寬索引也就是索引列超過2列的索引 設計...
mysql索引 使用注意事項
索引使用缺點 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行insert,update和delete。因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案 建立索引會占用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在要給大表上建了多種組合索引,索引檔案會膨脹很寬 ...