在MySQL資料庫中,沒有類似於SQL Server資料庫或Oracle資料庫中索引重建的語法(ALTER INDEX ... REBUILD),那麼在MySQL資料庫中,是否有什麼方式重建索引呢? 在官方文檔中"2.11.10 Rebuilding or Repairing Tables or I... ...
在MySQL資料庫中,沒有類似於SQL Server資料庫或Oracle資料庫中索引重建的語法(ALTER INDEX ... REBUILD),那麼在MySQL資料庫中,是否有什麼方式重建索引呢? 在官方文檔中"2.11.10 Rebuilding or Repairing Tables or Indexes"中,提到下麵三種方式可以Rebuild Index
· Dump and Reload Method
· ALTER TABLE Method
· REPAIR TABLE Method
另外, OPTIMIZE TABLE也會對索引進行重建,下麵我們來簡單驗證、測試一下,如有不對或不足的地方,敬請指正。
第一種方法(mysqldump導出然後重新導入),相當於重新CREATE INDEXES , 這裡就不討論了。下麵我們來看看其它幾種方法,那麼要判斷索引是否REBUILD了呢?我們來測試驗證一下吧,新建測試表如下:
CREATE TABLE t1 (
c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
c2 VARCHAR(100),
c3 VARCHAR(100) )
ENGINE=InnoDB;
create index ix_t1_c2 on t1(c2);
DROP INDEX + CREATE INDEX方法
這種方法過於簡單,這裡不敘說了。其實也沒有啥好說的。
ALTER TABLE方法
那麼我們能否在MySQL中找到索引的創建或修改時間呢?經過查證,目前而言,MySQL中是沒有相關係統表或視圖會記錄索引的創建時間的,我們可以用間接的方法來間接驗證,有些方法不是特別可靠和準確,最準確的方法應該是閱讀源碼:
1:表的創建時間,可以間接推斷索引的創建時間。因為索引的創建時間肯定在表的創建時間之後。
2:對應表的idb文件的修改或創建時間(若文件從創建後不曾修改過則可認為創建時間=修改時間,關於更多詳細內容,參考“Linux如何查找文件的創建時間”),當然這種方法不是非常準確。我們知道,對於InnoDB存儲引擎的表而言,對應的索引數據存儲在ibd文件中,所以文件的創建時間或修改時間是間接判斷索引創建時間。如果存儲引擎為MyISAM的話,還有專門的索引文件MYI。
註意:show indexes from tablename不會顯示索引創建時間
mysql> SELECT table_name,create_time FROM information_schema.TABLES WHERE table_name='t1';
+------------+---------------------+
| TABLE_NAME | CREATE_TIME |
+------------+---------------------+
| t1 | 2019-10-20 08:18:33 |
+------------+---------------------+
1 row in set (0.01 sec)
然後我們對錶進行ALTER TABLE t1 ENGINE = InnoDB;進行操作後,然後去驗證表的創建時間,如下所示,其實ALTER TABLE xxx ENGINE=InnoDB 其實等價於REBUILD表(REBUILD表就是重建表的意思),所以索引也等價於重新創建了。
在另外一個視窗,我們對比t1.ibd的創建時間,如下所示,也間接驗證了表和索引都REBUILD了。(這裡是MySQL 8.0.18 ,如果是之前的版本,還有frm之類的文件。)
[root@db-server MyDB]# ls -lrt t1*
-rw-r-----. 1 mysql mysql 131072 Oct 20 08:18 t1.ibd
[root@db-server MyDB]# stat t1.ibd
File: ‘t1.ibd’
Size: 131072 Blocks: 224 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 106665154 Links: 1
Access: (0640/-rw-r-----) Uid: ( 1000/ mysql) Gid: ( 1000/ mysql)
Context: system_u:object_r:mysqld_db_t:s0
Access: 2019-10-20 08:18:25.911990445 +0800
Modify: 2019-10-20 08:18:33.626989940 +0800
Change: 2019-10-20 08:18:33.626989940 +0800
Birth: -
[root@db-server MyDB]# stat t1.ibd
File: ‘t1.ibd’
Size: 131072 Blocks: 224 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 106665156 Links: 1
Access: (0640/-rw-r-----) Uid: ( 1000/ mysql) Gid: ( 1000/ mysql)
Context: system_u:object_r:mysqld_db_t:s0
Access: 2019-10-20 08:20:50.866980953 +0800
Modify: 2019-10-20 08:20:51.744980896 +0800
Change: 2019-10-20 08:20:51.744980896 +0800
Birth: -
REPAIR TABLE方法
REPAIR TABLE方法用於修複被破壞的表,而且它僅僅能用於MyISAM, ARCHIVE,CSV類型的表。下麵的測試環境為MySQL 5.6.41,創建測試表,然後對錶進行REPAIR TABLE操作
mysql> CREATE TABLE t (
-> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> c2 VARCHAR(100),
-> c3 VARCHAR(100) )
-> ENGINE=MyISAM;
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT table_name,create_time FROM information_schema.TABLES WHERE table_name='t';
+------------+---------------------+
| table_name | create_time |
+------------+---------------------+
| t | 2019-10-20 08:35:43 |
+------------+---------------------+
1 row in set (0.00 sec)