Mysql

InnoDB DROP INDEX 是否會在沒有 OPTIMIZE TABLE 的情況下釋放磁碟空間?

  • December 3, 2020

我們正在使用 MySQL 5.6 InnoDB 儲存引擎並且innodb_file_per_table是開啟的。我們有一些包含數億行的巨大表(> 100GB)。對於一些巨大的表,索引空間佔表空間的一半以上。我們發現一些索引是多餘的(感謝 Percona Toolkit)。我們是否可以簡單地刪除冗餘索引以釋放索引使用的磁碟空間而不使用 OPTIMIZE TABLE?

我測試了這個:

CREATE TABLE `mytable` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `t` text,
 PRIMARY KEY (`id`),
 KEY `t` (`t`(768))
) ENGINE=InnoDB 

我用數千行隨機數據填充它。

mysql> show table status like 'mytable'\G
*************************** 1. row ***************************
          Name: mytable
        Engine: InnoDB
       Version: 10
    Row_format: Dynamic
          Rows: 95030
Avg_row_length: 5660
   Data_length: 537903104
Max_data_length: 0
  Index_length: 190742528
     Data_free: 5242880

刪除了文本列上的索引:

mysql> alter table mytable drop index t;

刷新的information_schema統計:

mysql> analyze table mytable;

並檢查表狀態:

mysql> show table status like 'mytable'\G
*************************** 1. row ***************************
          Name: mytable
        Engine: InnoDB
       Version: 10
    Row_format: Dynamic
          Rows: 95030
Avg_row_length: 5660
   Data_length: 537903104
Max_data_length: 0
  Index_length: 0
     Data_free: 195035136

以前由索引佔用的空間現在位於data_free. 文件大小沒有縮小。

這與 InnoDB 的其他行為一致,即表空間文件永遠不會收縮,唯一可以讓您返回更多磁碟空間的方法是將數據複製到新的表空間文件。這需要足夠的可用磁碟空間來臨時保存舊表空間和新表空間。

因此,如果您沒有足夠的可用磁碟空間來執行此操作,您唯一的辦法是使用虛擬磁碟使整個儲存卷更大,或者將整個 MySQL 數據目錄移動到另一個已經有更大磁碟的伺服器。

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