MySQL ANALYZE TABLE Statement

The MySQL ANALYZE statement analyzes the specified table. This statement has three syntaxes −
This statement stores the key distribution analysis of the specified table(s). Following is the syntax of this table −
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
   TABLE tbl_name [, tbl_name] ...

Assume we have created a table with name Players in MySQL database using CREATE statement as shown below −
mysql> 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)
);
Query OK, 0 rows affected (0.62 sec)
Now, we will insert 7 records in Players table using INSERT statements −
mysql> insert into Players values(1, 'Shikhar', 'Dhawan', DATE('1981-12-05'), 'Delhi', 'India');
Query OK, 1 row affected (0.16 sec)

mysql> insert into Players values(2, 'Jonathan', 'Trott', DATE('1981-04-22'), 'CapeTown', 'SouthAfrica');
Query OK, 1 row affected (0.19 sec)

mysql> insert into Players values(3, 'Kumara', 'Sangakkara', DATE('1977-10-27'), 'Matale', 'Srilanka'); 
Query OK, 1 row affected (0.10 sec)

mysql> insert into Players values(4, 'Virat', 'Kohli', DATE('1988-11-05'), 'Delhi', 'India');
Query OK, 1 row affected (0.11 sec)

mysql> insert into Players values(5, 'Rohit', 'Sharma', DATE('1987-04-30'), 'Nagpur', 'India');
Query OK, 1 row affected (0.21 sec)

mysql> insert into Players values(6, 'Ravindra', 'Jadeja', DATE('1988-12-06'), 'Nagpur', 'India');
Query OK, 1 row affected (0.21 sec)

mysql> insert into Players values(7, 'James', 'Anderson', DATE('1982-06-30'), 'Burnley', 'England');
Query OK, 1 row affected (0.17 sec)
Following statement analyzes the above created table −
mysql> ANALYZE TABLE Players;
+--------------+---------+----------+----------+
| Table        | Op      | Msg_type | Msg_text |
+--------------+---------+----------+----------+
| mydb.players | analyze | status   | OK       |
+--------------+---------+----------+----------+
1 row in set (0.33 sec)
This statement stores the histogram statistics for the desired columns of the specified table and stores them in the data dictionary. Following is the syntax of this table −
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
   TABLE tbl_name
   UPDATE HISTOGRAM ON col_name [, col_name] ...
      [WITH N BUCKETS]
Following query analyzes the above created Players table using the ANALYZE TABLE Statement with UPDATE HISTOGRAM.
mysql> ANALYZE TABLE Players UPDATE HISTOGRAM ON First_Name, Last_Name;
+--------------+-----------+----------+-------------------------------------------------------+
| Table        | Op        | Msg_type | Msg_text                                              |
+--------------+-----------+----------+-------------------------------------------------------+
| mydb.players | histogram | status   | Histogram statistics created for column 'First_Name'. |
| mydb.players | histogram | status   | Histogram statistics created for column 'Last_Name'.  |
+--------------+-----------+----------+-------------------------------------------------------+
2 rows in set (0.15 sec)
This statement removes the histogram statistics for the columns of the specified table and from the data dictionary. Following is the syntax of this table −
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
   TABLE tbl_name
   DROP HISTOGRAM ON col_name [, col_name] ...
Following query is an example of the ANALYZE TABLE Statement with DROP HISTOGRAM −
mysql> ANALYZE TABLE Players DROP HISTOGRAM ON First_Name, Last_Name;
+--------------+-----------+----------+-------------------------------------------------------+
| Table        | Op        | Msg_type | Msg_text                                              |
+--------------+-----------+----------+-------------------------------------------------------+
| mydb.players | histogram | status   | Histogram statistics removed for column 'First_Name'. |
| mydb.players | histogram | status   | Histogram statistics removed for column 'Last_Name'.  |
+--------------+-----------+----------+-------------------------------------------------------+
2 rows in set (0.16 sec)
You can also analyze multiple tables and get the results using the ANALYZE TABLE Statement.
Assume we have created three new tables as shown below −
mysql> CREATE TABLE Test1(ID INT, Name VARCHAR(255));
Query OK, 0 rows affected (2.27 sec)

mysql> CREATE TABLE Test2(ID INT, Name VARCHAR(255));
Query OK, 0 rows affected (0.47 sec)

mysql> CREATE TABLE Test3(ID INT, Name VARCHAR(255));
Query OK, 0 rows affected (0.52 sec)
Following query analyzes all these tables and displays the result −
mysql> ANALYZE TABLE Test1, Test2, Test3;
+------------+---------+----------+----------+
| Table      | Op      | Msg_type | Msg_text |
+------------+---------+----------+----------+
| mydb.test1 | analyze | status   | OK       |
| mydb.test2 | analyze | status   | OK       |
| mydb.test3 | analyze | status   | OK       |
+------------+---------+----------+----------+
3 rows in set (0.63 sec)
If used with ANALYZE the EXPLAIN statement gives additional information such as timing of the execution and iterator-based, information like −
Estimated execution cost.
Estimated number of returned rows.
Time to return first row.
Time to return all rows (actual cost), in milliseconds.
Number of rows returned by the iterator.
Number of loops.
Suppose we have created a table with name EMPLOYEE and populated data into it as shown below −
mysql> 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
);
Query OK, 0 rows affected (0.36 sec)
mysql> INSERT INTO Employee VALUES
   (101, 'Ramya', 'Rama Priya', 27, 'F', 9000, 101),
   (102, 'Vinay', 'Bhattacharya', 20, 'M', 6000, 102);
And, if we have created another table and populated it as −
mysql> CREATE TABLE CONTACT(
   ID INT NOT NULL,
   EMAIL CHAR(20) NOT NULL,
   PHONE LONG,
   CITY CHAR(20)
);
mysql> INSERT INTO CONTACT (ID, EMAIL, CITY) VALUES
   (101, 'ramya@mymail.com', 'Hyderabad'),
   (102, 'vinay@mymail.com', 'Vishakhapatnam');
Following query deletes records from the above created tables −
mysql> SELECT * FROM EMPLOYEE INNER JOIN CONTACT ON CONTACT.id = EMPLOYEE.id;
+-----+------------+--------------+------+------+--------+---------+-----+------------------+-------+----------------+
| ID  | FIRST_NAME | LAST_NAME    | AGE  | SEX  | INCOME | CONTACT | ID  | EMAIL            | PHONE | CITY           |
+-----+------------+--------------+------+------+--------+---------+-----+------------------+-------+----------------+
| 101 | Ramya      | Rama Priya   | 27   | F    | 9000   | 101     | 101 | ramya@mymail.com | NULL  | Hyderabad      |
| 102 | Vinay      | Bhattacharya | 20   | M    | 6000   | 102     | 102 | vinay@mymail.com | NULL  | Vishakhapatnam |
+-----+------------+--------------+------+------+--------+---------+-----+------------------+-------+----------------+
2 rows in set (0.69 sec)
Following EXPLAIN statement displays the information about the above query −
EXPLAIN ANALYZE SELECT * FROM EMPLOYEE INNER JOIN CONTACT ON CONTACT.id = EMPLOYEE.id\G;
mysql> 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)

    31 Lectures 
     6 hours 

 Eduonix Learning Solutions

    84 Lectures 
     5.5 hours 

 Frahaan Hussain

    6 Lectures 
     3.5 hours 

 DATAhill Solutions Srinivas Reddy

    60 Lectures 
     10 hours 

 Vijay Kumar Parvatha Reddy

    10 Lectures 
     1 hours 

 Harshit Srivastava

    25 Lectures 
     4 hours 

 Trevoir Williams
 Print
 Add Notes
 Bookmark this page