當發起一個索引覆蓋查詢時,在explain的extra列可以看到using index的信息
覆蓋索引的坑:mysql查詢優化器會在執行查詢前判斷是否有一個索引能進行覆蓋,假設索引覆蓋了where條件中的字段,但不是整個查詢涉及的字段,mysql5.5和之前的版本也會回表獲取數據行,盡管並不需要這一行且最終會被過濾掉。
2.mysql不能在索引中執行LIke操作。mysql能在索引中做最左前綴匹配的like比較,但是如果是通配符開頭的like查詢,存儲引擎就無法做比較匹配。這種情況下mysql只能提取數據行的值而不是索引值來做比較
優化后SQL:添加索引(artist,title,prod_id),使用了延遲關聯(延遲了對列的訪問)
說明:在查詢的第一階段可以使用覆蓋索引,在from子句中的子查詢找到匹配的prod_id,然后根據prod_id值在外層查詢匹配獲取需要的所有值。
5.5時API設計不允許mysql將過濾條件傳到存儲引擎層(是把數據從存儲引擎拉到服務器層,在根據條件過濾),5.6之后由於ICP這個特性改善了查詢執行方式
