MYSQL EXPLAIN解析一 EXTRA中的USING INDEX,USING WHERE,USING INDEX CONDITION

1.简单介绍

using index 和using where只要使用了索引我们基本都能经常看到,而using index condition则是在mysql5.6后新加的新特性,我们先来看看mysql文档对using index condition的描述

附上mysql文档链接:https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html

简单来说,mysql开启了ICP的话,可以减少存储引擎访问基表的次数

下面来简单的介绍一下这三者的区别

using index :使用覆盖索引的时候就会出现

using where:在查找使用索引的情况下,需要回表去查询所需的数据

using index condition:查找使用了索引,但是需要回表查询数据

using index & using where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

以上四点就能看出它们之前的区别,或许有部分人都存在疑惑 using index & using where 和using index condition那个比较好,从上面的的解释中就能看出是前者比较好,毕竟不需要回表查询数据,效率上应该比较快的

下面是在stackoverflow中找到的答案:

MYSQL EXPLAIN解析一 EXTRA中的USING INDEX,USING WHERE,USING INDEX CONDITION_第1张图片

附上stackoverflow链接:https://stackoverflow.com/questions/28759576/mysql-using-index-condition-vs-using-where-using-index

查慢查询记录

# Time: 181020 11:53:11
# User@Host: zabbix[zabbix] @ localhost []
# Thread_id: 117743  Schema: zabbix  QC_hit: No
# Query_time: 2.857652  Lock_time: 0.000108  Rows_sent: 576  Rows_examined: 1728

SELECT itemid,COUNT(*) AS count,AVG(value) AS avg,MIN(value) AS min,MAX(value) AS max,round(1786* MOD(CAST(clock AS UNSIGNED)+158820,172800)/(172800),0) AS i,MAX(clock) AS clock FROM history_uint WHERE itemid='59886' AND clock>='1539834780' AND clock<='1540007580' GROUP BY itemid,round(1786* MOD(CAST(clock AS UNSIGNED)+158820,172800)/(172800),0);

对zabbix的history_uint表进行优化,优化前结果是

优化后是

MariaDB [zabbix]> explain SELECT itemid,COUNT(*) AS count,AVG(value) AS avg,MIN(value) AS min,MAX(value) AS max,round(1746* MOD(CAST(clock AS UNSIGNED)+67286,86400)/(86400),0) AS i,MAX(clock) AS clock FROM history_uint WHERE itemid='42794' AND clock>='1531199914' AND clock<='1531286314' GROUP BY itemid,round(1746* MOD(CAST(clock AS UNSIGNED)+67286,86400)/(86400),0);
+------+-------------+--------------+-------+----------------+----------------+---------+------+------+--------------------------------------------------------+
| id   | select_type | table        | type  | possible_keys  | key            | key_len | ref  | rows | Extra                                                  |
+------+-------------+--------------+-------+----------------+----------------+---------+------+------+--------------------------------------------------------+
|    1 | SIMPLE      | history_uint | range | history_uint_1 | history_uint_1 | 12      | NULL |  285 | Using index condition; Using temporary; Using filesort |
+------+-------------+--------------+-------+----------------+----------------+---------+------+------+--------------------------------------------------------+
1 row in set (0.00 sec)


MariaDB [zabbix]> explain SELECT itemid,COUNT(*) AS count,AVG(value) AS avg,MIN(value) AS min,MAX(value) AS max,round(1746* MOD(CAST(clock AS UNSIGNED)+67286,86400)/(86400),0) AS i,MAX(clock) AS clock FROM history_uint WHERE itemid='42794' AND clock>='1531199914' AND clock<='1531286314' GROUP BY itemid,round(1746* MOD(CAST(clock AS UNSIGNED)+67286,86400)/(86400),0)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: history_uint
         type: range
possible_keys: history_uint_1
          key: history_uint_1
      key_len: 12
          ref: NULL
         rows: 285
        Extra: Using index condition; Using temporary; Using filesort
1 row in set (0.00 sec)


MariaDB [zabbix]> show index from history_uint;
+--------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table        | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| history_uint |          1 | history_uint_1 |            1 | itemid      | A         |          19 |     NULL | NULL   |      | BTREE      |         |               |
| history_uint |          1 | history_uint_1 |            2 | clock       | A         |    38955665 |     NULL | NULL   |      | BTREE      |         |               |
+--------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.30 sec)


MariaDB [zabbix]> show columns from history_uint;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| itemid | bigint(20) unsigned | NO   | MUL | NULL    |       |
| clock  | int(11)             | NO   |     | 0       |       |
| value  | bigint(20) unsigned | NO   |     | 0       |       |
| ns     | int(11)             | NO   |     | 0       |       |
+--------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)


MariaDB [zabbix]> select count(distinct itemid),count(distinct clock),count(distinct value) from history_uint;
+------------------------+-----------------------+-----------------------+
| count(distinct itemid) | count(distinct clock) | count(distinct value) |
+------------------------+-----------------------+-----------------------+
|                  10065 |                730331 |               1492694 |
+------------------------+-----------------------+-----------------------+
1 row in set (2 min 24.30 sec)


MariaDB [zabbix]> alter table history_uint add index idx_i_c_v(itemid,clock,value);


Query OK, 0 rows affected (6 min 27.53 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

MariaDB [zabbix]> alter table history_uint drop index history_uint_1;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0


MariaDB [zabbix]> SHOW INDEX FROM history_uint;
+--------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table        | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| history_uint |          1 | idx_i_c_v |            1 | itemid      | A         |          16 |     NULL | NULL   |      | BTREE      |         |               |
| history_uint |          1 | idx_i_c_v |            2 | clock       | A         |    33357351 |     NULL | NULL   |      | BTREE      |         |               |
| history_uint |          1 | idx_i_c_v |            3 | value       | A         |    33357351 |     NULL | NULL   |      | BTREE      |         |               |
+--------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

3 rows in set (0.09 sec)

 

MariaDB [zabbix]> explain SELECT itemid,COUNT(*) AS count,AVG(value) AS avg,MIN(value) AS min,MAX(value) AS max,round(1746* MOD(CAST(clock AS UNSIGNED)+67286,86400)/(86400),0) AS i,MAX(clock) AS clock FROM history_uint WHERE itemid='42794' AND clock>='1531199914' AND clock<='1531286314' GROUP BY itemid,round(1746* MOD(CAST(clock AS UNSIGNED)+67286,86400)/(86400),0)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: history_uint
         type: range
possible_keys: idx_i_c_v
          key: idx_i_c_v
      key_len: 12
          ref: NULL
         rows: 284
        Extra: Using where; Using index; Using temporary; Using filesort
1 row in set (0.00 sec)


MariaDB [zabbix]> explain SELECT itemid,COUNT(*) AS count,AVG(value) AS avg,MIN(value) AS min,MAX(value) AS max,round(1746* MOD(CAST(clock AS UNSIGNED)+67286,86400)/(86400),0) AS i,MAX(clock) AS clock FROM history_uint WHERE itemid='42794' AND clock>='1531199914' AND clock<='1531286314' GROUP BY itemid,round(1746* MOD(CAST(clock AS UNSIGNED)+67286,86400)/(86400),0);
+------+-------------+--------------+-------+---------------+-----------+---------+------+------+-----------------------------------------------------------+
| id   | select_type | table        | type  | possible_keys | key       | key_len | ref  | rows | Extra                                                     |
+------+-------------+--------------+-------+---------------+-----------+---------+------+------+-----------------------------------------------------------+
|    1 | SIMPLE      | history_uint | range | idx_i_c_v     | idx_i_c_v | 12      | NULL |  284 | Using where; Using index; Using temporary; Using filesort |
+------+-------------+--------------+-------+---------------+-----------+---------+------+------+-----------------------------------------------------------+

1 row in set (0.00 sec)

MariaDB [zabbix]> select SQL_NO_CACHE itemid,COUNT(*) AS count,AVG(value) AS avg,MIN(value) AS min,MAX(value) AS max,round(1786* MOD(CAST(clock AS UNSIGNED)+158820,172800)/(172800),0) AS i,MAX(clock) AS clock FROM history WHERE itemid='59920' AND clock>='1539834780' AND clock<='1540007580' GROUP BY itemid,round(1786* MOD(CAST(clock AS UNSIGNED)+158820,172800)/(172800),0);

1785 rows in set (0.03 sec)

由原来的接近三秒优化到0.03

 

# Query_time: 101.392177  Lock_time: 0.000073  Rows_sent: 1  Rows_examined: 46443695

SET timestamp=1540089186;

select count(distinct itemid),count(distinct clock),count(distinct value) from history_uint;

MariaDB [zabbix]> select count(distinct itemid),count(distinct clock),count(distinct value) from history_uint;

+------------------------+-----------------------+-----------------------+

| count(distinct itemid) | count(distinct clock) | count(distinct value) |

+------------------------+-----------------------+-----------------------+

|                  10141 |                970077 |               1697310 |

+------------------------+-----------------------+-----------------------+

1 row in set (1 min 41.39 sec)

MariaDB [zabbix]> explain select  count(distinct itemid),count(distinct clock),count(distinct value) from history_uint;

+------+-------------+--------------+-------+---------------+-----------+---------+------+----------+-------------+

| id   | select_type | table        | type  | possible_keys | key       | key_len | ref  | rows     | Extra       |

+------+-------------+--------------+-------+---------------+-----------+---------+------+----------+-------------+

|    1 | SIMPLE      | history_uint | index | NULL          | idx_i_c_v | 20      | NULL | 47769538 | Using index |

+------+-------------+--------------+-------+---------------+-----------+---------+------+----------+-------------+

1 row in set (0.00 sec)

MariaDB [zabbix]> select SQL_NO_CACHE  count(distinct itemid),count(distinct clock),count(distinct value) from history_uint;

+------------------------+-----------------------+-----------------------+

| count(distinct itemid) | count(distinct clock) | count(distinct value) |

+------------------------+-----------------------+-----------------------+

|                  10141 |                971915 |               1696308 |

+------------------------+-----------------------+-----------------------+

1 row in set (50.51 sec)

估索引前用了101秒,用了索引只要50秒

你可能感兴趣的:(DB-MYSQL,ORACLE,SQLSERVER,zabbix,zabbix运维)