测试环境

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

MySQL倒序索引测试2的更多相关文章

  1. MySQL倒序索引测试1

    测试环境 MySQL Community Server 准备测试数据 DROP TABLE TB001; CREATE TABLE TB001(ID INT PRIMARY KEY AUTO_INCR ...

  2. MySQL 联合索引测试2

    接上一篇文章: http://www.cnblogs.com/xiaoit/p/4430300.html 1:首先删掉上一篇建立的索引,重新建立一个. mysql> DROP INDEX idx ...

  3. MySQL 联合索引测试

    搭建测试环境 1:创建表 CREATE TABLE tab_index (id int(5), age int(3), dte datetime); 2:插入测试数据 INSERT INTO tab_ ...

  4. MySQL 联合索引测试3

    接上一篇文章: http://www.cnblogs.com/xiaoit/p/4430387.html 有时候会出现某字段建立一个索引,但是查看执行计划的时候发现还是全扫了表? 可以强制走下索引看看 ...

  5. (译)MySQL 8.0实验室---MySQL中的倒序索引(Descending Indexes)

    译者注:MySQL 8.0之前,不管是否指定索引建的排序方式,都会忽略创建索引时候指定的排序方式(语法上不会报错),最终都会创建为ASC方式的索引,在执行查询的时候,只存在forwarded(正向)方 ...

  6. Mysql使用Java UUID作为唯一值时使用前缀索引测试

    Mysql可以使用字符串前缀 作为索引 以节约空间. 下面我们以 Java的UUID 生成的 32位(移除UUID中的 中划线)字符串 来做一下 测试. 表结构: CREATE TABLE `test ...

  7. MySQL(3)-索引

    一.索引类型 在MySQL中,存储引擎使用索引,首先在索引中找到对应值,然后根据匹配的索引记录中找到对应的行. 无论是多么复杂的ORM工具,在精妙和复杂的索引面前都是"浮云".这里 ...

  8. mysql高性能索引策略

    转载说明:http://www.nyankosama.com/2014/12/19/high-performance-index/ 1. 引言 随着互联网时代地到来,各种各样的基于互联网的应用和服务进 ...

  9. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引

    我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...

随机推荐

  1. python 项目实战之logging日志打印

    官网介绍:https://docs.python.org/2/library/logging.html 一. 基础使用 1.1 logging使用场景 日志是什么?这个不用多解释.百分之九十的程序都需 ...

  2. 自动签发https证书工具 cert manager

    最近cert manager进行升级,不再支持0.11以下的版本了,所以进行升级.但是发现不能直接通过更改镜像版本来升级,在Apps里的版本也是旧版本,部署后发现不支持,于是自已动手,根据文档整理了一 ...

  3. Golang(七)golang.org/x/time/rate 实现频率限制

    1. 源码阅读 整个包实现原理基于令牌桶算法:随时间以 1/r 个令牌的速度向容积为 b 个令牌的桶中添加令牌,有请求就取走令牌,若令牌不足则不执行请求或者等待 Allow 方法的调用链:lim.Al ...

  4. CountDownLatch源码

    public class CountDownLatchExample1 { public static void main(String[] args) throws Exception { Exec ...

  5. git 命令行回退到某个指定的版本

    1.在开发过程中遇到合并别人的代码或者合并主分支的代码导致自己的分支代码冲突或有别的问题,这时我们需要回退某个git提交历史的代码 用一下命令 git reset --hard 139dcfaa558 ...

  6. JMeter分布式测试环境搭建(禁用SSL)

    JMeter分布式环境,一台Master,一到多台Slave,Master和Slave可以是同一台机器. 前提条件: 所有机器,包括master和slave的机器: 1.运行相同版本的JMeter 2 ...

  7. 2019 ICPC 银川站

    I. Base62(高精度进制转换) 比赛当时雷菊苣和队长俩人拿着大数板子摸了一百多行(然后在缺少大数板子的情况下雷菊苣一发过了orz) 今天补题随便摸了个高精度进制转换的板子交上去就过了还贼短,, ...

  8. C基础 带你手写 redis sds

    前言 - Simple Dynamic Strings  antirez 想统一 Redis,Disque,Hiredis 项目中 SDS 代码, 因此构建了这个项目 https://github.c ...

  9. C++动态规划求解0-1背包问题

    问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,是的装入背包中物品的总价值最大? 细节须知: 暂无. 算法原理: a.最优子结构性质 ...

  10. 用LabVIEW实现《家国梦》游戏中自动收货收金币

    前几周,很流行一个手机游戏,叫<家国梦>.我在手机上玩了一两天后,发现了两个问题: 1. 收货收金币太没意思,只需要手指滑在固定的路线,一会儿就烦了 2. 怎么追赶也追不上手快的人(当然也 ...