MySQL - OPTIMIZE TABLE 語句



當我們在現有表上執行一些更改(如插入、更新、刪除等)時,表的物理儲存會發生變化,導致效能下降。

MySQL OPTIMIZE TABLE 語句

MySQL OPTIMIZE table 幫助您最佳化表儲存空間。它以一種提高輸入輸出效率並減少儲存空間的方式重新組織儲存資料。要執行此語句,您需要 SELECT 和 INSERT 許可權。

語法

以下是 MySQL OPTIMIZE TABLE 語句的語法:

OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL]
   TABLE tbl_name [, tbl_name] ...

示例

假設我們建立了一個名為 EMPLOYEE 的表,其 CREATE 語句如下所示:

CREATE TABLE EMPLOYEE(
   FIRST_NAME CHAR(20) NOT NULL,
   LAST_NAME CHAR(20),
   AGE INT,
   SEX CHAR(1),
   INCOME FLOAT
);

如果我們使用 INSERT 語句向其中插入了 4 條記錄,如下所示:

INSERT INTO EMPLOYEE VALUES
('Krishna', 'Sharma', 19, 'M', 2000),
('Raj', 'Kandukuri', 20, 'M', 7000),
('Ramya', 'Ramapriya', 25, 'F', 5000),
('Mac', 'Mohan', 26, 'M', 2000);

現在,讓我們將所有男性員工的年齡增加一年:

UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = 'M';
Rows matched: 3 Changed: 3 Warnings: 0

並且,以下語句從上表中刪除記錄:

DELETE FROM EMPLOYEE WHERE FIRST_NAME = 'Mac';

以下查詢優化了上面建立的表:

OPTIMIZE TABLE EMPLOYEE\G;

輸出

以上查詢產生以下輸出:

************ 1. row ************
   Table: mydb.employee
      Op: optimize
Msg_type: status
Msg_text: OK
2 rows in set (2.74 sec)

分析多個表

您還可以使用 OPTIMIZE TABLE 語句最佳化多個表並獲取結果。

示例

假設我們建立了三個新表,如下所示:

CREATE TABLE Test1(ID INT, Name VARCHAR(255));

CREATE TABLE Test2(ID INT, Name VARCHAR(255));

CREATE TABLE Test3(ID INT, Name VARCHAR(255));

以下查詢最佳化所有這些表並顯示結果:

OPTIMIZE TABLE Test1, Test2, Test3\G;

輸出

以下是上述查詢的輸出:

********** 1. row **********
   Table: mydb.test1
      Op: optimize
Msg_type: note
Msg_text: Table does not support optimize, doing recreate + analyze instead
********** 2. row **********
   Table: mydb.test1
      Op: optimize
Msg_type: status
Msg_text: OK
********** 3. row **********
   Table: mydb.test2
      Op: optimize
Msg_type: note
Msg_text: Table does not support optimize, doing recreate + analyze instead
********** 4. row **********
   Table: mydb.test2
      Op: optimize
Msg_type: status
Msg_text: OK
********** 5. row **********
   Table: mydb.test3
      Op: optimize
Msg_type: note
Msg_text: Table does not support optimize, doing recreate + analyze instead
********** 6. row **********
   Table: mydb.test3
      Op: optimize
Msg_type: status
Msg_text: OK
6 rows in set (4.52 sec)
mysql_statements_reference.htm
廣告