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)


  • 相关阅读:
    P1135 奇怪的电梯
    pycharm设置快捷键在keymap下拉列表没有eclipse怎么办
    记录selenium简单实现自动点击操作
    selenium 批量下载文件,json,重命名
    python3.6+selenium使用chrome浏览器自动将文件下载到指定路径
    selenium + Java 设置文件默认下载路径
    详解介绍Selenium常用API的使用Java语言(完整版)
    Pycharm安装robot framework运行插件
    Python之robotframework+pycharm测试框架!
    基于Python3 Robot framework环境搭建
  • 原文地址:https://www.cnblogs.com/DBABlog/p/12926962.html
Copyright © 2011-2022 走看看