MySQL - ANALYZE TABLE 語句



MySQL ANALYZE 語句分析指定的表。此語句有三種語法:

不帶直方圖的 ANALYZE TABLE 語句

此語句儲存指定表(表)的關鍵分佈分析。以下是此表的語法:

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

示例

假設我們已經使用 CREATE 語句在 MySQL 資料庫中建立了一個名為 Players 的表,如下所示:

CREATE TABLE Players(
   ID INT,
   First_Name VARCHAR(255),
   Last_Name VARCHAR(255),
   Date_Of_Birth date,
   Place_Of_Birth VARCHAR(255),
   Country VARCHAR(255),
   PRIMARY KEY (ID)
);

現在,我們將使用 INSERT 語句在 Players 表中插入 7 條記錄:

Insert into Players values
(1, 'Shikhar', 'Dhawan', DATE('1981-12-05'), 'Delhi', 'India'),
(2, 'Jonathan', 'Trott', DATE('1981-04-22'), 'CapeTown', 'SouthAfrica'),
(3, 'Kumara', 'Sangakkara', DATE('1977-10-27'), 'Matale', 'Srilanka'), 
(4, 'Virat', 'Kohli', DATE('1988-11-05'), 'Delhi', 'India'),
(5, 'Rohit', 'Sharma', DATE('1987-04-30'), 'Nagpur', 'India'),
(6, 'Ravindra', 'Jadeja', DATE('1988-12-06'), 'Nagpur', 'India'),
(7, 'James', 'Anderson', DATE('1982-06-30'), 'Burnley', 'England');

以下語句分析上面建立的表:

ANALYZE TABLE Players;

輸出

以下是上述程式的輸出:

操作 訊息型別 訊息文字
mydb.players 分析 狀態 OK

帶 UPDATE HISTOGRAM 的 ANALYZE TABLE 語句

此語句儲存指定表所需列的直方圖統計資訊,並將它們儲存在資料字典中。以下是此表的語法:

ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
TABLE tbl_name
UPDATE HISTOGRAM ON col_name [, col_name] ...
[WITH N BUCKETS]

示例

以下查詢使用帶有 UPDATE HISTOGRAM 的 ANALYZE TABLE 語句分析上面建立的 Players 表。

ANALYZE TABLE Players UPDATE HISTOGRAM ON First_Name, Last_Name;

輸出

上述 mysql 查詢產生以下輸出:

操作 訊息型別 訊息文字
mydb.players 直方圖 狀態 為 'First_Name' 列建立直方圖統計資訊。
mydb.players 直方圖 狀態 為 'Last_Name' 列建立直方圖統計資訊。

帶 DROP HISTOGRAM 的 ANALYZE TABLE 語句

此語句從資料字典中刪除指定表列的直方圖統計資訊。以下是此表的語法:

ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
TABLE tbl_name
DROP HISTOGRAM ON col_name [, col_name] ...

示例

以下查詢是帶有 DROP HISTOGRAM 的 ANALYZE TABLE 語句的示例:

ANALYZE TABLE Players DROP HISTOGRAM ON First_Name, Last_Name;

輸出

以下是上述 mysql 查詢的輸出:

操作 訊息型別 訊息文字
mydb.players 直方圖 狀態 已刪除 'First_Name' 列的直方圖統計資訊。
mydb.players 直方圖 狀態 已刪除 'Last_Name' 列的直方圖統計資訊。

分析多個表

您還可以分析多個表並使用 ANALYZE 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));

以下查詢分析所有這些表並顯示結果:

ANALYZE TABLE Test1, Test2, Test3;

輸出

上述 mysql 查詢將產生以下輸出:

操作 訊息型別 訊息文字
mydb.test1 分析 狀態 OK
mydb.test2 分析 狀態 OK
mydb.test3 分析 狀態 OK

帶有 EXPLAIN 的 ANALYZE 語句

如果與 ANALYZE 一起使用,EXPLAIN 語句將提供其他資訊,例如執行時間和基於迭代器的資訊,例如:

  • 估計執行成本。
  • 估計返回的行數。
  • 返回第一行的時間。
  • 返回所有行的時間(實際成本),以毫秒為單位。
  • 迭代器返回的行數。
  • 迴圈次數。

示例

假設我們建立了一個名為 EMPLOYEE 的表,並向其中填充了資料,如下所示:

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

現在,讓我們嘗試向 EMPLOYEE 表中插入一些記錄:

INSERT INTO Employee VALUES
(101, 'Ramya', 'Rama Priya', 27, 'F', 9000, 101),
(102, 'Vinay', 'Bhattacharya', 20, 'M', 6000, 102);

而且,如果我們建立了另一個表並填充了它,如下所示:

CREATE TABLE CONTACT(
   ID INT NOT NULL,
   EMAIL CHAR(20) NOT NULL,
   PHONE LONG,
   CITY CHAR(20)
);

讓我們嘗試使用 INSERT 語句向 CONTACT 表中插入一些記錄:

INSERT INTO CONTACT (ID, EMAIL, CITY) VALUES
(101, 'ramya@mymail.com', 'Hyderabad'),
(102, 'vinay@mymail.com', 'Vishakhapatnam');

以下查詢從上面建立的表中刪除記錄:

SELECT * FROM EMPLOYEE INNER JOIN CONTACT ON 
CONTACT.id = EMPLOYEE.id\G;

輸出

以下是上述查詢的輸出:

************ 1. row ************
        ID: 101
FIRST_NAME: Ramya
 LAST_NAME: Rama Priya
       AGE: 27
       SEX: F
    INCOME: 9000
   CONTACT: 101
        ID: 101
     EMAIL: ramya@mymail.com
     PHONE: NULL
      CITY: Hyderabad
************ 2. row ************
        ID: 102
FIRST_NAME: Vinay
 LAST_NAME: Bhattacharya
       AGE: 20
       SEX: M
    INCOME: 6000
   CONTACT: 102
        ID: 102
     EMAIL: vinay@mymail.com
     PHONE: NULL
      CITY: Vishakhapatnam

以下 EXPLAIN 語句顯示有關上述查詢的資訊:

EXPLAIN ANALYZE SELECT * FROM EMPLOYEE INNER JOIN CONTACT ON 
CONTACT.id = EMPLOYEE.id\G;
EXPLAIN ANALYZE SELECT * FROM EMPLOYEE INNER JOIN CONTACT ON 
CONTACT.id = EMPLOYEE.id\G;

輸出

以下是輸出:

*************************** 1. row ***************************
EXPLAIN: -> Inner hash join (contact.ID = employee.ID) 
(cost=1.10 rows=2) (actual time=0.086..0.091 rows=2 loops=1)
   -> Table scan on CONTACT (cost=0.18 rows=2) 
   (actual time=0.008..0.011 rows=2 loops=1)
   -> Hash
      -> Table scan on EMPLOYEE (cost=0.45 rows=2) 
	  (actual time=0.043..0.051 rows=2 loops=1)

1 row in set (0.00 sec)
廣告