Mysql

批量刪除後是否需要重新索引 mysql 表?

  • June 8, 2019

我在 MySQL 中有一個表,每秒有很多 INSERT 和 SELECT。並且每天一次批量刪除一些舊數據。刪除後是否需要重新索引表?我想提高性能。有人可以提出一些建議嗎?使用“innodb”作為儲存引擎。我需要改變它嗎?我認為它更適合併發插入和選擇。請提出您的建議。我需要重新索引嗎?

提前致謝..

使用 InnoDB 時需要優化表嗎?是和否,取決於您的工作量以及您是否遇到性能問題。

來自MySQL 文件的無恥複製粘貼:

對於 InnoDB 表,OPTIMIZE TABLE 映射到 ALTER TABLE,它會重建表以更新索引統計資訊並釋放聚集索引中未使用的空間。當您在 InnoDB 表上執行時,它會顯示在 OPTIMIZE TABLE 的輸出中,如下所示:

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

此操作不使用快速索引創建。二級索引的創建效率不高,因為鍵是按照它們在主鍵中出現的順序插入的。請參閱第 14.14.6 節,“快速索引創建的限制”。

InnoDB 使用頁面分配方法儲存數據,並且不會像傳統儲存引擎(如 MyISAM)那樣遭受碎片化。在考慮是否執行優化時,請考慮您的伺服器將處理的事務的工作量:

  • 預計會有一定程度的碎片化。InnoDB 僅填充 93% 的頁面,為更新留出空間,而無需拆分頁面。
  • 刪除操作可能會留下空白,使頁面的填充量低於預期,這使得優化表是值得的。
  • 當有足夠的空間可用時,根據數據類型和行格式,對行的更新通常會重寫同一頁中的數據。請參閱第 14.10.5 節,“InnoDB 表的壓縮如何工作”和第 14.12.1 節,“InnoDB 行儲存概述”。
  • 隨著時間的推移,高並發工作負載可能會在索引中留下空白,因為 InnoDB 通過其 MVCC 機制保留了相同數據的多個版本。請參閱第 14.5.12 節,“InnoDB 多版本”。

您可以重新索引表,甚至縮小表。但是,如果您想延遲此類基於磁碟的維護,您至少應該重新計算索引統計資訊。

如果不重新計算索引統計資訊,MySQL 查詢優化器可能會為查詢 EXPLAIN 計劃做出錯誤的選擇。如果不存在數據的統計資訊仍然存在,這可能會對 SELECT 產生不利影響。MyISAM 和 InnoDB 都是如此。

您不必縮小表來計算索引統計資訊,儘管它會更好地提高整體性能。

要計算表中所有索引的統計資訊,您將執行

ANALYZE TABLE tablename;

你可以每晚都這樣做。它不會嘗試對數據進行任何碎片整理或收縮。您可以每週執行一次OPTIMIZE TABLE tablename;。這也將在表的物理文件(對於 InnoDB 或MyISAM)或ANALYZE TABLE tablename;收縮後為您完成。.ibd``.MYI

引用自:https://dba.stackexchange.com/questions/82607