本文章假設讀者已了解mysql的索引基礎知識,如b+樹,聚集索引,並對explain分析結果已了解。以下主要分析mysql的索引選擇原理及演算法。
mysql innodb的查詢一般基於explian所獲取的最小rows來選擇使用哪乙個索引。rows是乙個estimate的值,其估計演算法(規則)如下:
1.如果是select c from where a=***,a上有索引。mysql大概率會使用a上的索引。其rows計算規則為rows = ((records_pleft + records_p1 + records_p2 + ... + records_p8 + records_pright)/10)*page_num。
每一頁的page_size可以通過innodb_index_stats表裡的stat_name欄位的n_diff_pfx0?和size估算出。如果n_diff_pfx0?為1000000,size為2000,則每頁儲存500。如果a對應的記錄數在500*10=5000內,則此explian獲得的rows基本上比較精確,即通過10頁的取樣全部獲取。如果a對應的記錄數在5000以上,則rows不準確。參見
2.如果是select c from where a=*** order by c ,a和c上都有索引。大概率會走a上索引。因為a的索引是精確查詢(explain type 是 const或者ref),用c的索引則是全索引表掃瞄。
3.如果是select c from where a=*** order by c limit 1 ,a和c上都有索引。這時mysql第一步先用a索引估算出rows值 。然後第二步,嘗試再用c的索引來修正rows值:其演算法是拿全表的總條數除以第一步算出來的rows,然後乘以limit的值。如全表有1000000條記錄,第一步估算出是rows是20000,則rows會變成(1000000/20000)* 1=50。50<20000,則用索引c。如果limit 2,則rows為100,用索引c。一直到估算出來的值大於20000(limit 400左右),才會選用a的索引。見
。這裡最有意思的是mysql是假設你查詢的記錄是均勻的分布在索引表裡的,所以會有這樣演算法。
4.如果是select c from where a=*** limit 1,則還是會走a索引,因為mysql不會有上述的第二步。
mysql 分析工具:trace介紹:
分析explain整個過程。
set global optimizer_trace='enabled=on';
select c from where a=*** order by c limit 1
select * from information_schema.optimizer_trace;可以分析上步整個trace過程。
Mysql 索引原理與詳解
索引的原理 索引的優點和缺點和使用原則 索引優點 索引缺點 使用原則 什麼時候新增索引 索引的分類 普通索引 index 使用規則 1.乙個表中可以有多個index欄位 2.欄位的值可以有重複,也可以為null值。字段值無約束 3.經常把做查詢條件的字段設定為index欄位 4.index欄位的ke...
mysql 選擇索引 mysql選擇索引
1 盡量為用來搜尋 分類或分組的資料列編制索引,不要為作為輸出顯示的資料列編制索引。最適合有索引的資料列是那些在where子句中資料列,在聯結子句 現的資料列,或者是在group by order by子句 現的資料列。select 後的資料列最好不要用索引。2 綜合考慮各資料列的維度。資料列的維度...
mysql索引的選擇 Mysql索引選擇邏輯
索引選擇邏輯 優化器選擇索引的目的,是找到乙個最優的執行方案,並用最小的代價去執行語句。在資料庫裡面,掃瞄行數是影響執行代價的因素之一。掃瞄的行數越少,意味著訪問磁碟資料的次數越少,消耗的 cpu 資源越少 掃瞄行數是怎麼判斷的?mysql 在真正開始執行語句之前,並不能精確地知道滿足這個條件的記錄...