2014-07-17 19 views
1

在我們生產的MySQL系統中,我們有一些查詢通常會花費不到2秒的時間執行,但有時它們會運行一分鐘以上。每當其中一個查詢運行很久時,我們檢查索引並發現基數已經落在同一個VARCHAR(25)字段中。我們將MySQL作爲一個具有多個從服務器的主服務器集羣來運行,我們將發現只有該慢服務器系統的基數已經下降,所有其他服務器上的值仍然很高。當價值下降時,它將從約20k-30k(高價值)下降到僅有幾百。運行ANALYZE TABLE命令修復基數並將其備份到20k-30k,並且查詢再次快速運行。是什麼導致MySQL基數降低?

我已經開始監視所有表上的基數,以查看這個值如何隨時間變化。我知道基數會隨着新數據的增加而增加,並且我希望隨着記錄的刪除,它會下降,但是這張表很少會被記錄刪除,但是每次我看它時,這個值都會上下變動。

MySQL的InnoDB的5.5.8

的CentOS 5.7

什麼我應該尋找任何想法? COUT(*)= 402259

+0

http://bugs.mysql.com/bug.php?id=44760? – eggyal

+0

如果不是因爲我使用InnoDB而不是ndbcluster,並且該錯誤在版本5.1中報告並希望我使用的5.5不會出現這樣的舊錯誤,那麼錯誤44760看起來可疑地類似。還是很有趣的。 – LinuxGuru

+0

您是否找到此原因? –

回答

1

InnoDB表的統計數據是近似值,不準確。因此,如果您想知道某個字段的確切基數,可以運行以下查詢:

SELECT COUNT(DISTINCT field_name) FROM table_name 
+0

所有的從機都與主機7657具有相同的計數。當我使用SHOW INDEXES FROM table_name時,主機上的基數爲9305,從機上的基數爲21189,11503,7742&6913。所有奴隸都在主人後面零秒。這些數字在幾分鐘內保持不變,然後與21189的奴隸下降到7742,而所有其他奴隸和主人保持不變。 – LinuxGuru

+0

這是可能的,非常正常。事實上,即使它們具有完全相同的數據,也很難在不同的服務器上獲得相同的統計數據。這背後有幾個因素。主要因素是InnoDB存儲數據和索引的方式。它使用B-Tree進行索引,其中顯示基數。嘗試檢查主設備和從設備上的文件大小,它不會相同。 –