zoukankan      html  css  js  c++  java
  • MySQL倒序索引测试2

    测试环境

    MySQL Community Server 8.0.17 

    准备测试数据

    DROP TABLE TB001;
    CREATE TABLE TB001(ID INT PRIMARY KEY AUTO_INCREMENT,C1 INT);
    INSERT INTO TB001(C1) SELECT 1 FROM information_schema.columns LIMIT 1000;
    
    DROP TABLE TB002;
    CREATE TABLE TB002(ID INT PRIMARY KEY AUTO_INCREMENT,C1 INT,C2 INT,C3 CHAR(100));
    
    
    INSERT INTO TB002(C1,C2,C3)
    SELECT T1.ID,T2.ID,REPEAT('',100) FROM TB001 AS T1,TB001 AS T2 WHERE T1.ID<300 AND T2.ID<3000;

    测试SQL:

    SELECT * 
    FROM TB002 
    ORDER BY c1,c2 DESC 
    LIMIT 10;

    使用普通索引

    ALTER TABLE TB002 ADD INDEX IDX_C1_C2(C1,C2);

    执行计划为:

    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra          |
    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------+
    |  1 | SIMPLE      | TB002 | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 292380 |   100.00 | Using filesort |
    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------+

    消耗资源情况:

    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    | Status                         | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | Swaps |
    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    | starting                       | 0.000046 | 0.000036 |   0.000006 |            0 |             0 |     0 |
    | Executing hook on transaction  | 0.000004 | 0.000003 |   0.000001 |            0 |             0 |     0 |
    | starting                       | 0.000007 | 0.000006 |   0.000001 |            0 |             0 |     0 |
    | checking permissions           | 0.000005 | 0.000004 |   0.000001 |            0 |             0 |     0 |
    | Opening tables                 | 0.000024 | 0.000021 |   0.000004 |            0 |             0 |     0 |
    | init                           | 0.000005 | 0.000004 |   0.000001 |            0 |             0 |     0 |
    | System lock                    | 0.000007 | 0.000005 |   0.000001 |            0 |             0 |     0 |
    | optimizing                     | 0.000004 | 0.000004 |   0.000000 |            0 |             0 |     0 |
    | statistics                     | 0.000012 | 0.000009 |   0.000002 |            0 |             0 |     0 |
    | preparing                      | 0.000013 | 0.000011 |   0.000002 |            0 |             0 |     0 |
    | executing                      | 0.313603 | 0.313474 |   0.000000 |            0 |             0 |     0 |
    | end                            | 0.000011 | 0.000006 |   0.000000 |            0 |             0 |     0 |
    | query end                      | 0.000004 | 0.000004 |   0.000000 |            0 |             0 |     0 |
    | waiting for handler commit     | 0.000008 | 0.000008 |   0.000000 |            0 |             0 |     0 |
    | closing tables                 | 0.000006 | 0.000006 |   0.000000 |            0 |             0 |     0 |
    | freeing items                  | 0.000013 | 0.000013 |   0.000000 |            0 |             0 |     0 |
    | logging slow query             | 0.000033 | 0.000033 |   0.000000 |            0 |             8 |     0 |
    | cleaning up                    | 0.000014 | 0.000013 |   0.000000 |            0 |             0 |     0 |
    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    总执行时间:0.31381650

    使用倒序索引

    ALTER TABLE TB002 ADD INDEX IDX_C1_C2_DESC(C1,C2 DESC);

    执行计划为:

    +----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+-------+
    | id | select_type | table | partitions | type  | possible_keys | key            | key_len | ref  | rows | filtered | Extra |
    +----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+-------+
    |  1 | SIMPLE      | TB002 | NULL       | index | NULL          | IDX_C1_C2_DESC | 10      | NULL |   10 |   100.00 | NULL  |
    +----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+-------+

    资源消耗情况:

    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    | Status                         | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | Swaps |
    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    | starting                       | 0.000046 | 0.000036 |   0.000007 |            0 |             0 |     0 |
    | Executing hook on transaction  | 0.000004 | 0.000002 |   0.000000 |            0 |             0 |     0 |
    | starting                       | 0.000006 | 0.000006 |   0.000001 |            0 |             0 |     0 |
    | checking permissions           | 0.000005 | 0.000004 |   0.000001 |            0 |             0 |     0 |
    | Opening tables                 | 0.000024 | 0.000020 |   0.000004 |            0 |             0 |     0 |
    | init                           | 0.000005 | 0.000004 |   0.000000 |            0 |             0 |     0 |
    | System lock                    | 0.000006 | 0.000005 |   0.000001 |            0 |             0 |     0 |
    | optimizing                     | 0.000004 | 0.000004 |   0.000001 |            0 |             0 |     0 |
    | statistics                     | 0.000011 | 0.000009 |   0.000002 |            0 |             0 |     0 |
    | preparing                      | 0.000022 | 0.000019 |   0.000003 |            0 |             0 |     0 |
    | explaining                     | 0.000033 | 0.000027 |   0.000005 |            0 |             0 |     0 |
    | end                            | 0.000004 | 0.000003 |   0.000001 |            0 |             0 |     0 |
    | query end                      | 0.000003 | 0.000003 |   0.000000 |            0 |             0 |     0 |
    | waiting for handler commit     | 0.000007 | 0.000006 |   0.000002 |            0 |             0 |     0 |
    | closing tables                 | 0.000006 | 0.000005 |   0.000001 |            0 |             0 |     0 |
    | freeing items                  | 0.000009 | 0.000007 |   0.000001 |            0 |             0 |     0 |
    | cleaning up                    | 0.000125 | 0.000107 |   0.000020 |            0 |             0 |     0 |
    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    总执行时间:0.00032000

    总结

    对于查询:

    SELECT * 
    FROM TB002 
    ORDER BY c1,c2 DESC 
    LIMIT 10;

    分别使用普通索引和倒序索引:

    ALTER TABLE TB002 ADD INDEX IDX_C1_C2(C1,C2);
    ALTER TABLE TB002 ADD INDEX IDX_C1_C2_DESC(C1,C2 DESC);

    对于普通索引,查询无法使用索引且使用filesort,导致严重的性能问题。

    对于倒序索引,查询使用倒序索引,能快速返回数据,性能较好。

    MySQL从"最开始不支持倒序索引"到"支持倒序索引",功能在不断完善,但相对于商用数据库来说,这还是很"辣鸡"啊,相同的数据结构下,SQL Server能完美使用"普通索引"来优化查询,MySQL的查询优化器还有很长的路要走!!!

  • 相关阅读:
    JAVA WEBSERVICE服务端&客户端的配置及调用(基于JDK)
    An internal error occurred during: "Launching New_configuration"
    Android 创建虚拟机时“提示no system images installed for this target”
    [转] 传说中的WCF(2):服务协定的那些事儿
    [转] 传说中的WCF
    python的包管理
    python入门常用方法(转json,模拟浏览器请求头,写入文件)
    python读写数据篇
    python跳坑手记
    python爬虫入门篇
  • 原文地址:https://www.cnblogs.com/gaogao67/p/11608550.html
Copyright © 2011-2022 走看看