MySQL添加索引优化SQL
在慢查询日志中有一条慢SQL,执行时间约为3秒
mysql> SELECT
-> t.total_meeting_num,
-> r.voip_user_num
-> FROM
-> (
-> SELECT
-> count(*) total_meeting_num
-> FROM
-> Conference
-> WHERE
-> isStart = 1
-> AND startTime >= ADDDATE(now(), - 1)
-> AND billingcode != 651158
-> AND billingcode != 651204
-> ) t,
-> (
-> SELECT
-> count(userID) voip_user_num
-> FROM
-> (
-> SELECT
-> conferenceID,
-> userID,
-> isOnline,
-> createdTime
-> FROM
-> (
-> SELECT
-> *
-> FROM
-> ConferenceUser
-> WHERE
-> createdTime >= ADDDATE(now(), - 1)
-> AND userID > 1000
-> ORDER BY
-> userID,
-> createdTime DESC
-> ) t
-> GROUP BY
-> userID
-> ) t,
-> (
-> SELECT
-> *
-> FROM
-> Conference
-> WHERE
-> isStart = 1
-> AND startTime >= ADDDATE(now(), - 1)
-> AND conferenceName NOT LIKE 'evmonitor%'
-> ) r
-> WHERE
-> t.isOnline = 1
-> AND t.conferenceID = r.conferenceID
-> ) r;
+-------------------+---------------+
| total_meeting_num | voip_user_num |
+-------------------+---------------+
| 29 | 48 |
+-------------------+---------------+
1 row in set (3.01 sec)
查看执行计划
mysql> explain SELECT
-> t.total_meeting_num,
-> r.voip_user_num
-> FROM
-> (
-> SELECT
-> count(*) total_meeting_num
-> FROM
-> Conference
-> WHERE
-> isStart = 1
-> AND startTime >= ADDDATE(now(), - 1)
-> AND billingcode != 651158
-> AND billingcode != 651204
-> ) t,
-> (
-> SELECT
-> count(userID) voip_user_num
-> FROM
-> (
-> SELECT
-> conferenceID,
-> userID,
-> isOnline,
-> createdTime
-> FROM
-> (
-> SELECT
-> *
-> FROM
-> ConferenceUser
-> WHERE
-> createdTime >= ADDDATE(now(), - 1)
-> AND userID > 1000
-> ORDER BY
-> userID,
-> createdTime DESC
-> ) t
-> GROUP BY
-> userID
-> ) t,
-> (
-> SELECT
-> *
-> FROM
-> Conference
-> WHERE
-> isStart = 1
-> AND startTime >= ADDDATE(now(), - 1)
-> AND conferenceName NOT LIKE 'evmonitor%'
-> ) r
-> WHERE
-> t.isOnline = 1
-> AND t.conferenceID = r.conferenceID
-> ) r;
+----+-------------+----------------+--------+----------------+----------------+---------+------+---------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------+--------+----------------+----------------+---------+------+---------+---------------------------------+
| 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | |
| 1 | PRIMARY | <derived3> | system | NULL | NULL | NULL | NULL | 1 | |
| 3 | DERIVED | <derived6> | ALL | NULL | NULL | NULL | NULL | 18 | |
| 3 | DERIVED | <derived4> | ALL | NULL | NULL | NULL | NULL | 12667 | Using where; Using join buffer |
| 6 | DERIVED | Conference | range | ind_start_time | ind_start_time | 5 | NULL | 889 | Using where |
| 4 | DERIVED | <derived5> | ALL | NULL | NULL | NULL | NULL | 18918 | Using temporary; Using filesort |
| 5 | DERIVED | ConferenceUser | ALL | NULL | NULL | NULL | NULL | 6439656 | Using where; Using filesort |
| 2 | DERIVED | Conference | range | ind_start_time | ind_start_time | 5 | NULL | 889 | Using where |
+----+-------------+----------------+--------+----------------+----------------+---------+------+---------+---------------------------------+
8 rows in set (3.04 sec)
查看索引
mysql> show index from ConferenceUser;
+----------------+------------+-----------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------------+------------+-----------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| ConferenceUser | 0 | PRIMARY | 1 | recordID | A | 6439758 | NULL | NULL | | BTREE | | |
| ConferenceUser | 0 | PRIMARY | 2 | conferenceID | A | 6439758 | NULL | NULL | | BTREE | | |
| ConferenceUser | 1 | ind_conference_userID | 1 | conferenceID | A | 804969 | NULL | NULL | | BTREE | | |
| ConferenceUser | 1 | ind_conference_userID | 2 | userID | A | 3219879 | NULL | NULL | | BTREE | | |
+----------------+------------+-----------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)
在表的列上添加索引
mysql> alter table ConferenceUser add index index_createdtime(createdTime);
Query OK, 6439784 rows affected (38.46 sec)
Records: 6439784 Duplicates: 0 Warnings: 0
查看索引
mysql> show index from ConferenceUser;
+----------------+------------+-----------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------------+------------+-----------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| ConferenceUser | 0 | PRIMARY | 1 | recordID | A | NULL | NULL | NULL | | BTREE | | |
| ConferenceUser | 0 | PRIMARY | 2 | conferenceID | A | 6439794 | NULL | NULL | | BTREE | | |
| ConferenceUser | 1 | ind_conference_userID | 1 | conferenceID | A | 715532 | NULL | NULL | | BTREE | | |
| ConferenceUser | 1 | ind_conference_userID | 2 | userID | A | 3219897 | NULL | NULL | | BTREE | | |
| ConferenceUser | 1 | index_createdtime | 1 | createdTime | A | 6439794 | NULL | NULL | | BTREE | | |
+----------------+------------+-----------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
5 rows in set (0.00 sec)
再次执行时间缩短为0.17秒
mysql> SELECT
-> t.total_meeting_num,
-> r.voip_user_num
-> FROM
-> (
-> SELECT
-> count(*) total_meeting_num
-> FROM
-> Conference
-> WHERE
-> isStart = 1
-> AND startTime >= ADDDATE(now(), - 1)
-> AND billingcode != 651158
-> AND billingcode != 651204
-> ) t,
-> (
-> SELECT
-> count(userID) voip_user_num
-> FROM
-> (
-> SELECT
-> conferenceID,
-> userID,
-> isOnline,
-> createdTime
-> FROM
-> (
-> SELECT
-> *
-> FROM
-> ConferenceUser
-> WHERE
-> createdTime >= ADDDATE(now(), - 1)
-> AND userID > 1000
-> ORDER BY
-> userID,
-> createdTime DESC
-> ) t
-> GROUP BY
-> userID
-> ) t,
-> (
-> SELECT
-> *
-> FROM
-> Conference
-> WHERE
-> isStart = 1
-> AND startTime >= ADDDATE(now(), - 1)
-> AND conferenceName NOT LIKE 'evmonitor%'
-> ) r
-> WHERE
-> t.isOnline = 1
-> AND t.conferenceID = r.conferenceID
-> ) r;
+-------------------+---------------+
| total_meeting_num | voip_user_num |
+-------------------+---------------+
| 29 | 52 |
+-------------------+---------------+
1 row in set (0.17 sec)
查看执行计划
mysql> explain SELECT
-> t.total_meeting_num,
-> r.voip_user_num
-> FROM
-> (
-> SELECT
-> count(*) total_meeting_num
-> FROM
-> Conference
-> WHERE
-> isStart = 1
-> AND startTime >= ADDDATE(now(), - 1)
-> AND billingcode != 651158
-> AND billingcode != 651204
-> ) t,
-> (
-> SELECT
-> count(userID) voip_user_num
-> FROM
-> (
-> SELECT
-> conferenceID,
-> userID,
-> isOnline,
-> createdTime
-> FROM
-> (
-> SELECT
-> *
-> FROM
-> ConferenceUser
-> WHERE
-> createdTime >= ADDDATE(now(), - 1)
-> AND userID > 1000
-> ORDER BY
-> userID,
-> createdTime DESC
-> ) t
-> GROUP BY
-> userID
-> ) t,
-> (
-> SELECT
-> *
-> FROM
-> Conference
-> WHERE
-> isStart = 1
-> AND startTime >= ADDDATE(now(), - 1)
-> AND conferenceName NOT LIKE 'evmonitor%'
-> ) r
-> WHERE
-> t.isOnline = 1
-> AND t.conferenceID = r.conferenceID
-> ) r;
+----+-------------+----------------+--------+-------------------+-------------------+---------+------+-------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------+--------+-------------------+-------------------+---------+------+-------+---------------------------------+
| 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | |
| 1 | PRIMARY | <derived3> | system | NULL | NULL | NULL | NULL | 1 | |
| 3 | DERIVED | <derived6> | ALL | NULL | NULL | NULL | NULL | 20 | |
| 3 | DERIVED | <derived4> | ALL | NULL | NULL | NULL | NULL | 12682 | Using where; Using join buffer |
| 6 | DERIVED | Conference | range | ind_start_time | ind_start_time | 5 | NULL | 879 | Using where |
| 4 | DERIVED | <derived5> | ALL | NULL | NULL | NULL | NULL | 18951 | Using temporary; Using filesort |
| 5 | DERIVED | ConferenceUser | range | index_createdtime | index_createdtime | 4 | NULL | 31455 | Using where; Using filesort |
| 2 | DERIVED | Conference | range | ind_start_time | ind_start_time | 5 | NULL | 879 | Using where |
+----+-------------+----------------+--------+-------------------+-------------------+---------+------+-------+---------------------------------+
8 rows in set (0.18 sec)