1. 復現例子.?
2.例子對應的是不斷刪除歷史數據, 然后insert新數據的場景.?
1.優(yōu)化器的邏輯:?
? ? 1.優(yōu)化器的目的: 找到一個最優(yōu)的執(zhí)行方案
? ? 2.最優(yōu)判斷方式: 掃描行數, 是否使用臨時表, 是否排序.?
? ?3.掃描行數是如何判斷的 ??
? ? ? ? 1.根據統計信息估算
? ? ? ? ? ? 統計信息==> 索引的區(qū)分度
? ? ? ? ? ? 索引上不同值的個數 ==> 基數
? ? ? ? ? ? ==> 基數越大,區(qū)分度越高
? ? ? ? ? ? ==> show index? 可以看到基數. cardinality?
? ? ? ? ? ? ? ? ? ? 注意: 實際上基數都應該是10萬,?
? ? 4.mysql是怎么得到索引基數的??
? ? ? ? 1. 采樣統計:? 因為全表掃描代價大.?
? ? ? ? ? ? 基數 ==> 默認選擇N個數據頁, 統計頁上的不同值, 得到一個平均值, 乘以這個索引的頁面數.?
? ? ? ? ? ? 因為數據表會持續(xù)更新 ==> 當變更的數據行數超過1/ M的時候, 觸發(fā)一次索引統計.?
? ? ? ? ? ? 兩種存儲索引統計的方式 : innodb_stats_persistent
? ? ? ? ? ? ? ? ==> on ==> 持久化 N=20, M10
? ? ? ? ? ? ? ? ==> off ==> 內存 N=8 M=16
? ? 5.索引統計只是入參, Mysql需判斷SQL語句本身要掃描多少行.
疑問2: 為什么放著row 30000+的不用, 用100000+的執(zhí)行計劃呢??
? ? 答: 因為回表的時間優(yōu)化器也計算在內
? ? ==> 推斷1: 主鍵索引比普通索引優(yōu)先級高.?
疑問3 :? 為什么會得到錯誤的掃描行數 ??
? ? 6.解決統計信息錯誤 => analyze table? t;?
2.索引選擇異常和處理
1.解決方案1 : force index? ==> 硬編碼;
2. 修改SQL 引導Mysql
3.新建一個索引, 或者 刪除誤用索引.?
==> 推論3:? 對于優(yōu)化器來說:? 索引統計, 排序,使用臨時表是有同等權重的. (看源碼把)
? ??