• 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的查询优化器还有很长的路要走!!!

  • 相关阅读:
    我非要捅穿这 Neutron(三)架构分析与代码实现篇(基于 OpenStack Rocky)
    我非要捅穿这 Neutron(二)上层资源模型篇
    $('.one + div')选取class为one的下一个元素
    15分钟,教你用Python爬网站数据,并用BI可视化分析!
    $("div span")选取里的所有的元素
    根据给定的元素名匹配元素
    根据给定的类名匹配元素
    根据给定的id匹配一个元素
    想创业,请问有没有投资小的项目?
    Vue组件间的通信
  • 原文地址:https://www.cnblogs.com/gaogao67/p/11608550.html
Copyright © 2020-2023  润新知