MySQL索引選擇問題

2021-10-05 04:43:46 字數 1022 閱讀 2861

在進行資料查詢的時候,mysql優化器會自動為查詢語句選擇合適的索引,索引選擇的正確與否對mysql的執行速度有很大影響。使用explain語句可以查詢得到執行計畫的詳細內容,而優化器選擇索引的目的,是找到乙個最優的執行方案,並用最小的代價去執行語句。在資料庫裡面,掃瞄行數是影響執行代價的因素之一。掃瞄的行數越少,意味著訪問磁碟資料的次數越少,消耗的cpu資源越少,當然除了掃瞄行數之外也有其他考慮因素,包括是否需要回表等。

那麼mysql怎麼在執行前預判掃瞄行數呢?首先乙個索引上不同的值越多,這個索引的區分度就越好。而乙個索引上不同的值的個數,我們稱之為「基數」(cardinality)。也就是說,這個基數越大,索引的區分度越好,可以通過show index from t來檢視索引的詳細資訊。mysql通過取樣的方式來估算每張表的基數,取樣統計的時候,innodb缺省會選擇n個資料頁,統計這些頁面上的不同值,得到乙個平均值,然後乘以這個索引的頁面數,就得到了這個索引的基數。而資料表是會持續更新的,索引統計資訊也不會固定不變。所以,當變更的資料行數超過1/m的時候,會自動觸發重新做一次索引統計。

在mysql中,有兩種儲存索引統計的方式,可以通過設定引數innodb_stats_persistent的值來選擇:

設定為on的時候,表示統計資訊會持久化儲存。這時,預設的n是20,m是10。

設定為off的時候,表示統計資訊只儲存在記憶體中。這時,預設的n是8,m是16。

可以看到無論是上面哪一種,對於資料量比較大的表來說,取樣的數量都很小,所以並不能保證統計的準確,如果你發現explain的結果預估的rows值跟實際情況差距比較大,可以用analyze table t來更新統計資訊。

當選錯索引時,可以採取的辦法有:

採用force index強行選擇乙個索引

可以考慮修改語句,引導mysql使用我們期望的索引

可以新建乙個更合適的索引,來提供給優化器做選擇,或刪掉誤用的索引

mysql實戰45講

mysql 選擇索引 mysql選擇索引

1 盡量為用來搜尋 分類或分組的資料列編制索引,不要為作為輸出顯示的資料列編制索引。最適合有索引的資料列是那些在where子句中資料列,在聯結子句 現的資料列,或者是在group by order by子句 現的資料列。select 後的資料列最好不要用索引。2 綜合考慮各資料列的維度。資料列的維度...

mysql索引的選擇 Mysql索引選擇邏輯

索引選擇邏輯 優化器選擇索引的目的,是找到乙個最優的執行方案,並用最小的代價去執行語句。在資料庫裡面,掃瞄行數是影響執行代價的因素之一。掃瞄的行數越少,意味著訪問磁碟資料的次數越少,消耗的 cpu 資源越少 掃瞄行數是怎麼判斷的?mysql 在真正開始執行語句之前,並不能精確地知道滿足這個條件的記錄...

mysql索引的選擇 MySQL索引的選擇

hash索引和b 樹索引 那為什麼不使用其他的資料結構作為索引?hash索引 雜湊表的特點就是可以快速的精確查詢,但是不支援範圍查詢。如果做成了索引,那速度也是很慢的,要全部掃瞄。平衡二叉樹 1 索引也不只是在記憶體裡面儲存的,還是要落盤持久化的,如果資料多了,樹高會很高,查詢的成本就會隨著樹高的增...