優化器的目的是選擇索引。他會根據自己內部的判斷,從而選擇乙個最優的執行方案。而判斷是乙個因素就是掃瞄行數,越少的掃瞄行數,就說明訪問磁碟的資料次數越少,消耗的cpu資源也就越少。
1.掃瞄行數如何判斷
mysql開始執行之前,並不能知道,滿足這個條件的記錄有多少,而只能採用統計的方法,進行預估。這個統計的結果就是索引的區分度。
索引區分度(基數)的統計機制:innodb 缺省會選擇 n 個資料頁,統計這些頁面上的不同值,得到乙個平均值,然後乘以這個索引的頁面數,就得到了這個索引的基數
在 mysql 中,有兩種儲存索引統計的方式,可以通過設定引數 innodb_stats_persistent 的值來選擇:設定為 on 的時候,表示統計資訊會持久化儲存。這時,這種統計方法很容易造成不準確。但是如果相差太大 可以採用修正統計的方式 進行補救,也會有一定的改善預設的 n 是 20,m 是 10。
設定為 off 的時候,表示統計資訊只儲存在記憶體中。這時,預設的 n 是 8,m 是 16。
analyze
table t
2.優化器誤判
就算統計資訊相對準確,優化器還是可能會誤判。這個時候的解決方法:
mysql索引選錯 10 mysql選錯索引
10 mysql選錯索引 在mysql表中可以支援多個索引,有的sql不指定使用哪個索引,由mysql自己來決定,但是有時候mysql選錯了索引,導致執行很慢。例子create table t10 id int 11 not null,a int 11 default null,b int 11 d...
mysql選錯索引的解決
mysql選錯索引的解決 analyze table 表名 1 強制選擇索引 force index eg select from t force index a where a between 10000 and 20000 缺點 這麼寫不優美 如果索引改了名字,這個語句也得改,顯得很麻煩 遷移資...
10 mysql選錯索引
在mysql表中可以支援多個索引,有的 sql不指定使用哪個索引,由 mysql 自己來決定,但是有時候 mysql 選錯了索引,導致執行很慢。例子create table t10 id int 11 not null a int 11 default null b int 11 default n...