zoukankan      html  css  js  c++  java
  • 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)


  • 相关阅读:
    HDU 4832(DP+计数问题)
    mongodb安装与使用
    (hdu step 6.3.7)Cat vs. Dog(当施工方规则:建边当观众和其他观众最喜爱的东西冲突,求最大独立集)
    dba_dependencies查询结果视图
    情绪一点点
    c#基于这些,你已经看到了?(一)-----谁才刚刚开始学习使用
    九. 200创业教训万元获得--“神刻”这是忽悠?
    初步swift语言学习笔记6(ARC-自己主动引用计数,内存管理)
    采用CSS3 Media Query技术适应Android平板屏幕分辨率和屏幕像素密度
    线程的上下文
  • 原文地址:https://www.cnblogs.com/DBABlog/p/12926962.html
Copyright © 2011-2022 走看看