1. 程式人生 > >關於mysql主從查詢執行計劃不一致問題的分析

關於mysql主從查詢執行計劃不一致問題的分析

最近面試過程中被面試官拋了一個問題,說曾經有一個線上出現的奇怪的問題,主庫和從庫各種配置是一致的,當資料量比較大的時候,某些時候同樣的查詢,在從庫裡的執行計劃執行成功了,而主庫裡沒有執行這個執行計劃,問我這是為什麼?

當時我的回答是主庫偏重於寫資料,從庫偏重於讀資料,既然mysql的查詢語句執行計劃是有可能改變的說明mysql的語句執行計劃是可能隨著資料的變化而發生調整的,如果分析是認為原定執行計劃沒有成功執行,那麼我們可以對執行計劃進行控制,也許自己可以進行配置。答案明顯是錯的,我只是根據自己對問題的理解進行了想法的闡述。

那麼真正的情況如何呢?其實答案就是隱藏在那些理所當然的思路的背後。眾所周知,mysql的索引不能建的太多,因為mysql在資料增刪比較頻繁的情況下需要花費大量資源進行重建索引。而mysql有協調機制,如果一段時間內資料量變化較大,會將調整索引的計劃推遲,直至判斷資料變化不大的時候才會去重建索引。所以這就造成了,mysql在評判不同的執行計劃的時候,如果突然新增的資料量很大,不走索引反而比走索引所花費的時間更短,就相應的將執行計劃調整為不走索引。

因此,在資料量變化較大的時候進行主庫查詢,其實可以對應先判斷一下不同執行策略所耗費的時間,如果走索引耗費的時間更長,說明索引沒有重建完成,可以進行手動重建索引,然後再進行判斷執行計劃之間的時間差異。之後mysql的執行計劃選擇器自然會判斷出正確的執行計劃。