• MySQL倒序索引测试1


    测试环境

    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
    WHERE C1=20
    ORDER BY 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       | ref  | IDX_C1_C2     | IDX_C1_C2 | 5       | const | 1000 |   100.00 | Backward index scan |
    +----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+---------------------+

    资源消耗情况:

    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    | Status                         | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | Swaps |
    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    | starting                       | 0.000048 | 0.000000 |   0.000043 |            0 |             0 |     0 |
    | Executing hook on transaction  | 0.000004 | 0.000000 |   0.000002 |            0 |             0 |     0 |
    | starting                       | 0.000006 | 0.000000 |   0.000006 |            0 |             0 |     0 |
    | checking permissions           | 0.000005 | 0.000000 |   0.000005 |            0 |             0 |     0 |
    | Opening tables                 | 0.000025 | 0.000000 |   0.000026 |            0 |             0 |     0 |
    | init                           | 0.000005 | 0.000000 |   0.000004 |            0 |             0 |     0 |
    | System lock                    | 0.000006 | 0.000000 |   0.000006 |            0 |             0 |     0 |
    | optimizing                     | 0.000007 | 0.000000 |   0.000007 |            0 |             0 |     0 |
    | statistics                     | 0.000042 | 0.000000 |   0.000043 |            0 |             0 |     0 |
    | preparing                      | 0.000011 | 0.000000 |   0.000010 |            0 |             0 |     0 |
    | executing                      | 0.000066 | 0.000000 |   0.000066 |            0 |             0 |     0 |
    | end                            | 0.000003 | 0.000000 |   0.000002 |            0 |             0 |     0 |
    | query end                      | 0.000003 | 0.000000 |   0.000003 |            0 |             0 |     0 |
    | waiting for handler commit     | 0.000006 | 0.000000 |   0.000006 |            0 |             0 |     0 |
    | closing tables                 | 0.000004 | 0.000000 |   0.000004 |            0 |             0 |     0 |
    | freeing items                  | 0.000008 | 0.000000 |   0.000008 |            0 |             0 |     0 |
    | cleaning up                    | 0.000007 | 0.000000 |   0.000007 |            0 |             0 |     0 |
    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    
    总执行时间:0.00025375

    使用倒序索引

    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       | ref  | IDX_C1_C2_DESC | IDX_C1_C2_DESC | 5       | const | 1000 |   100.00 | NULL  |
    +----+-------------+-------+------------+------+----------------+----------------+---------+-------+------+----------+-------+

    资源消耗情况:

    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    | Status                         | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | Swaps |
    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    | starting                       | 0.000051 | 0.000040 |   0.000008 |            0 |             0 |     0 |
    | Executing hook on transaction  | 0.000004 | 0.000002 |   0.000000 |            0 |             0 |     0 |
    | starting                       | 0.000006 | 0.000005 |   0.000001 |            0 |             0 |     0 |
    | checking permissions           | 0.000005 | 0.000005 |   0.000001 |            0 |             0 |     0 |
    | Opening tables                 | 0.000026 | 0.000021 |   0.000004 |            0 |             0 |     0 |
    | init                           | 0.000005 | 0.000004 |   0.000001 |            0 |             0 |     0 |
    | System lock                    | 0.000006 | 0.000006 |   0.000001 |            0 |             0 |     0 |
    | optimizing                     | 0.000008 | 0.000006 |   0.000002 |            0 |             0 |     0 |
    | statistics                     | 0.000045 | 0.000038 |   0.000007 |            0 |             0 |     0 |
    | preparing                      | 0.000012 | 0.000010 |   0.000002 |            0 |             0 |     0 |
    | executing                      | 0.000071 | 0.000059 |   0.000012 |            0 |             0 |     0 |
    | end                            | 0.000004 | 0.000004 |   0.000001 |            0 |             0 |     0 |
    | query end                      | 0.000004 | 0.000003 |   0.000000 |            0 |             0 |     0 |
    | waiting for handler commit     | 0.000007 | 0.000006 |   0.000002 |            0 |             0 |     0 |
    | closing tables                 | 0.000021 | 0.000018 |   0.000003 |            0 |             0 |     0 |
    | freeing items                  | 0.000013 | 0.000010 |   0.000002 |            0 |             0 |     0 |
    | cleaning up                    | 0.000009 | 0.000007 |   0.000002 |            0 |             0 |     0 |
    +--------------------------------+----------+----------+------------+--------------+---------------+-------+
    
    总执行时间:0.00029675

    总结

    对于查询:

    SELECT *
    FROM TB002
    WHERE C1=20
    ORDER BY 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);
  • 相关阅读:
    jQuery each的实现与call方法的详细介绍
    转载Entity Framework 5.0(EF first)中的添加,删除,修改,查询,状态跟踪操作
    转载有个小孩跟我说LINQ(重点讲述Linq中GroupBy的原理及用法)
    luogu P3305 [SDOI2013]费用流
    bzoj 4819: [Sdoi2017]新生舞会
    bzoj4817: [Sdoi2017]树点涂色
    bzoj4816: [Sdoi2017]数字表格
    bzoj 4818: [Sdoi2017]序列计数
    [JSOI2007]重要的城市(x)
    BZOJ 1009 [HNOI2008]GT考试
  • 原文地址:https://www.cnblogs.com/gaogao67/p/11608299.html
Copyright © 2020-2023  润新知