optimize命令是mysql的常用優化命令,但是在InnoDB與MyISAM這兩個存儲引擎中卻有很大的分別。本文將對這兩個常用的存儲引擎進行區分跟實例解析
1、查看mysql當前的存儲引擎
一般情況下,mysql會默認提供多種存儲引擎,你可以通過下面的查看: 看你的mysql現在已提供什么存儲引擎: mysql> show engines; 看你的mysql當前默認的存儲引擎: mysql> show variables like '%storage_engine%'; 你要看某個表用了什么引擎(在顯示結果里參數engine后面的就表示該表當前用的存儲引擎): mysql> show create table 表名;
如下顯示zabbix history表的存儲引擎
MariaDB [zabbix]> show create table history \G;
*************************** 1. row ***************************
Table: history
Create Table: CREATE TABLE `history` (
`itemid` bigint(20) unsigned NOT NULL,
`clock` int(11) NOT NULL DEFAULT '0',
`value` double(16,4) NOT NULL DEFAULT '0.0000',
`ns` int(11) NOT NULL DEFAULT '0',
KEY `history_1` (`itemid`,`clock`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
/*!50100 PARTITION BY RANGE (`clock`)
(PARTITION p201802010000 VALUES LESS THAN (1517500800) ENGINE = InnoDB,
PARTITION p201802020000 VALUES LESS THAN (1517587200) ENGINE = InnoDB,
PARTITION p201802030000 VALUES LESS THAN (1517673600) ENGINE = InnoDB,
PARTITION p201802040000 VALUES LESS THAN (1517760000) ENGINE = InnoDB,
PARTITION p201802050000 VALUES LESS THAN (1517846400) ENGINE = InnoDB,
PARTITION p201802070000 VALUES LESS THAN (1518019200) ENGINE = InnoDB,
PARTITION p201802080000 VALUES LESS THAN (1518105600) ENGINE = InnoDB,
PARTITION p201802090000 VALUES LESS THAN (1518192000) ENGINE = InnoDB,
PARTITION p201802100000 VALUES LESS THAN (1518278400) ENGINE = InnoDB,
PARTITION p201802110000 VALUES LESS THAN (1518364800) ENGINE = InnoDB,
PARTITION p201802120000 VALUES LESS THAN (1518451200) ENGINE = InnoDB,
PARTITION p201802130000 VALUES LESS THAN (1518537600) ENGINE = InnoDB,
PARTITION p201802140000 VALUES LESS THAN (1518624000) ENGINE = InnoDB,
PARTITION p201802150000 VALUES LESS THAN (1518710400) ENGINE = InnoDB,
PARTITION p201802160000 VALUES LESS THAN (1518796800) ENGINE = InnoDB,
PARTITION p201802170000 VALUES LESS THAN (1518883200) ENGINE = InnoDB,
PARTITION p201802180000 VALUES LESS THAN (1518969600) ENGINE = InnoDB,
PARTITION p201802190000 VALUES LESS THAN (1519056000) ENGINE = InnoDB,
PARTITION p201802200000 VALUES LESS THAN (1519142400) ENGINE = InnoDB,
PARTITION p201802210000 VALUES LESS THAN (1519228800) ENGINE = InnoDB) */
1 row in set (0.00 sec)
當對表有大量的增刪改操作時,需要用optimize對表進行優化。可以減少空間與提高I/O性能性能;
如果表存儲引擎為MyISAM可以直接使用命令optimize table 表名;
查看show table status like 'history' \G; 中的data_free選項;data_free選項代表數據碎片。
如果是InnoDB引擎,首先查看innodb_file_per_table(是否獨享表空間)。
MariaDB [zabbix]> show variables like 'innodb_file_per_table'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.01 sec)
ON代表共享表空間打開,OFF代表開啟共享表空間沒有打開,即采用的是默認的共享表空間。這個時候可以在mysql的datadir路徑下看到一個非常大的文件ibdata1,這個文件存儲了所有InnoDB表的數據與索引。
如果表是InnoDB,執行如下命令
MariaDB [zabbix]> optimize table history; +----------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------------+----------+----------+-------------------------------------------------------------------+ | zabbix.history | optimize | note | Table does not support optimize, doing recreate + analyze instead | | zabbix.history | optimize | status | OK | +----------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (14.33 sec)
會返回如圖信息,最后的一條Table does not support optimize, doing recreate + analyze instead,即代表optimize無法優化表。
這個時候使用如下命令優化表
MariaDB [zabbix]> alter table history ENGINE = 'InnoDB'; Query OK, 256060 rows affected (14.27 sec) Records: 256060 Duplicates: 0 Warnings: 0 MariaDB [zabbix]> analyze table history; +----------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +----------------+---------+----------+----------+ | zabbix.history | analyze | status | OK | +----------------+---------+----------+----------+ 1 row in set (0.00 sec)
-
如果開啟了獨享表空間,即每張表都有ibdfile。這個時候如果刪除了大量的行,索引會重組並且會釋放相應的空間因此不必優化