2008-11-26 115 views
24

我讀到過here重構大慢SQL查詢,而目前最高響應是米奇小麥,誰希望確保查詢使用索引的主要選擇,並提到:什麼時候應該重建數據庫索引?

第一件事我會做的是檢查以確保有一個活動的索引維護作業定期運行。如果沒有,重新獲得所有現有的索引或者如果不可能,至少得到統計數據更新。

我只是業餘DBA,我做了幾個程序自由職業者,基本上是Java桌面客戶端,偶爾也是MySQL後端。當我設置系統時,我知道要在要查詢的列上創建一個索引,還有一個varchar CaseID和一個varchar CustName。

但是,我在幾個月前設置了這個系統,並且讓客戶端操作它,我相信這些索引應該隨着數據輸入而增長,並且我相信一切仍然很好。我很擔心這些指標應該定期重建,因爲今天我讀到應該有一個「積極的維護工作」。我唯一的維護工作就是每晚進行備份。

我想問社區關於數據庫可能需要的定期維護。是否需要重建索引?我可以信任MySQL後端繼續進行下去,只要沒有人干擾它,並且數據保持在幾千兆字節之下?

回答

24

沒有必要'重建'索引。他們始終保持最新狀態。也許他是指重建桌子。根據您的使用模式和模式,您可以在InnoDB中獲得碎片頁面,我也可以在MyISAM中使用。重建表可以通過消除磁盤上的數據碎片來提高性能。我不經常使用MyISAM表,但我相信建議使用某些使用模式運行「OPTIMIZE TABLE」。查看OPTIMIZE TABLE上的MySQL文檔,獲取關於MyISAM和InnoDB的更多信息。

我不太熟悉MyISAM的複雜性,但對於InnoDB來說,統計數據可能會過時。該數據庫保留了有關如何爲給定索引分配數據的估計統計數據,並且這些數據可能會過時,但MySQL/InnoDB具有一些內置功能來嘗試統計當前數據。你通常不必擔心它。

所以,如果您使用的是InnoDB,答案是否定的,您通常不需要主動做任何事情來保持索引的良好運行。我對MyISAM不太確定,我認爲需要定期優化這些表更常見。

11

設置一個cronjob來優化索引並檢查錯誤通常是一個好主意。

請參閱mysqlcheck。一個典型的cron作業看起來像mysqlcheck -Aaos,它會檢查所有數據庫中的所有表以查找錯誤,優化索引並僅在錯誤時輸出。

+0

如果不打擾客戶,我就無法訪問機器,並且讓他陷入思考可能會出現問題的地步。我知道使用模式,並且正在尋找有關何時需要優化的信息。 – Karl 2008-11-26 19:22:51

+0

然後說實話?我不會爲此而出汗。 – Eli 2008-11-27 00:11:58

2

您關於「定期維護」鏈接的答案是在臨時表的特定上下文中定期截斷和重新填充。您不需要對絕大多數MySQL數據庫安裝執行此操作。

相關問題