覆蓋索引:只有索引包含了where條件部分和select返回部分的所有字段,才能實現這個目的(只要查詢的條件和返回字段中的 所有字段都能被一個非主鍵索引覆蓋,就能用覆蓋索引)
-
如果查詢條件使用的是普通索引(或是聯合索引的最左原則字段),查詢結果是聯合索引的字段或是主鍵,不用回表操作,直接返回結果,減少IO磁盤讀寫讀取正行數據
- 通常情況下建議使用第二種
-
1.select * from T where k in(1,2,3,4); 2.select * from T where k between 1 and 4;
- why?
- 第一個要搜索5次,第二個搜索1次
- 數據量很大的時候,二級索引比主鍵索引更快”,這個結論是隻有在使用覆蓋索引時才成立,因爲不需要回表
- 如果查詢順序和聯合索引的順序不一致,優化器會自動做優化
- MySQL5.6引入的索引下推優化,可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。
- 建立索引會增加insert和update時的消耗,但是能加快查詢,如果做讀寫分離,主庫不建立索引,從庫建立索引,帶來的風險是主從同步的時候延遲會更加大,