前言
本文簡要介紹優化器選擇索引的依據有哪些,有什么辦法人為引導優化器選擇更優的執行方案,
為什么會出現選錯索引
可能是統計索引基數資訊錯誤,導致優化器錯選索引,也可能是MySQL的bug,
選擇依據
優化器選擇索引的依據有掃描行記錄數、回表次數、是否創建臨時表和是否排序,
索引掃描行數,通過取樣的方式統計索引列上不同的值數量,取N張資料頁,統計頁面上不同值的數量,然后估算總的不同數量(基數cardinality),這也稱之為索引的“區分度”,可以通過SHOW INDEX FROM table_name來查看每個索引的基數,
對于這條執行陳述句 SELECT * FROM t WHERE a BETWEEN (1, 10000) AND b BETWEEN (50000, 100000) ORDER BY b LIMIT 1,從掃描行數上考慮,應該選擇a上的索引,但通過MySQL執行計劃發現,實際選擇了b索引,因為優化器考慮了需要根據b排序,選擇b索引掃描獲取記錄可以避免再排序,但是,使用a索引的查詢耗時遠比使用b索引耗時低,
如何避免選錯索引
1、強制使用索引
使用force Index(a)強制SQL執行時采用某個索引,比如SELECT * FROM t force Index(a) WHERE a BETWEEN (1, 10000) AND b BETWEEN (50000, 100000) ORDER BY b LIMIT 1,
2、重新計算基數
因為MySQL取樣估計基數可能存在比較大的誤差,導致優化器選擇低效的執行方案,為了避免這個統計資訊的問題,可以使用Analyze TABLE t來重新統計資訊,
3、選擇更合適的索引或者洗掉誤用的索引
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/299103.html
標籤:MySQL
下一篇:SQL-索引
