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的查询优化器还有很长的路要走!!!
MySQL倒序索引测试2的更多相关文章
- MySQL倒序索引测试1
测试环境 MySQL Community Server 准备测试数据 DROP TABLE TB001; CREATE TABLE TB001(ID INT PRIMARY KEY AUTO_INCR ...
- MySQL 联合索引测试2
接上一篇文章: http://www.cnblogs.com/xiaoit/p/4430300.html 1:首先删掉上一篇建立的索引,重新建立一个. mysql> DROP INDEX idx ...
- MySQL 联合索引测试
搭建测试环境 1:创建表 CREATE TABLE tab_index (id int(5), age int(3), dte datetime); 2:插入测试数据 INSERT INTO tab_ ...
- MySQL 联合索引测试3
接上一篇文章: http://www.cnblogs.com/xiaoit/p/4430387.html 有时候会出现某字段建立一个索引,但是查看执行计划的时候发现还是全扫了表? 可以强制走下索引看看 ...
- (译)MySQL 8.0实验室---MySQL中的倒序索引(Descending Indexes)
译者注:MySQL 8.0之前,不管是否指定索引建的排序方式,都会忽略创建索引时候指定的排序方式(语法上不会报错),最终都会创建为ASC方式的索引,在执行查询的时候,只存在forwarded(正向)方 ...
- Mysql使用Java UUID作为唯一值时使用前缀索引测试
Mysql可以使用字符串前缀 作为索引 以节约空间. 下面我们以 Java的UUID 生成的 32位(移除UUID中的 中划线)字符串 来做一下 测试. 表结构: CREATE TABLE `test ...
- MySQL(3)-索引
一.索引类型 在MySQL中,存储引擎使用索引,首先在索引中找到对应值,然后根据匹配的索引记录中找到对应的行. 无论是多么复杂的ORM工具,在精妙和复杂的索引面前都是"浮云".这里 ...
- mysql高性能索引策略
转载说明:http://www.nyankosama.com/2014/12/19/high-performance-index/ 1. 引言 随着互联网时代地到来,各种各样的基于互联网的应用和服务进 ...
- SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引
我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...
随机推荐
- 基于react开发package.json的配置
项目依赖 react网页开发的3件套: react, react-dom, react-router-dom, redux, react-reduxreact的UI组件库: antd(pc端), an ...
- Vim编辑器点滴积累
Vim编辑器点滴积累 vim tab键空格数量控制 参考链接 临时:进入VIM,执行: :set tabstop=4 永久:编辑用户目录下.vimrc文件,添加:set tabstop=4 vim 安 ...
- Eclipse启动发生的错误:An internal error occurred during: "Initializing Java Tooling".
1.启动Eclipse时,初始化异常:An internal error occurred during: "Initializing Java Tooling". 解决方案:wi ...
- vb.net 以读文本文件的方式对XML文件进行遍历
' 对XML文件按照文本文件的方式进行遍历 Private Sub checkFile_establishEntity(strFile As String) Dim reader AsTextR ...
- 基于web公交查询系统---搭建mvc连接数据库(我的毕业设计,进度继续)
建立一个spring的项目:我在已经做过的项目基础下做的,所以接口连接数据库挺快. 搭建好的.对应好数据库: 前几天进度已经完成简单的设计: 完成登录,用户管理(修改删除). 继续的数据库的信息获取, ...
- 《Linux就该这么学》培训笔记_ch18_使用MariaDB数据库管理系统
<Linux就该这么学>培训笔记_ch18_使用MariaDB数据库管理系统 文章最后会post上书本的笔记照片. 文章主要内容: 初始化MariaDB服务 管理用户以及授权 创建数据库与 ...
- angular get 数据请求
数据请求 get 新建一个服务 1. ng g service services /+服务名 eg:ng g service services/player 在此服务中进行设置 引入自带组件以及注册 ...
- [工具]法国神器mimikatz 2.1.1 一键版 & PowerShell版
无需任何参数,运行EXE即可自动读取Windows系统密码 EXE版需要其它功能请使用原版 (参数已写死仅读密码) 结果保存于当前目录mz.log EXE https://github.com/k8g ...
- 本周使用angular7所遇到的一些问题
前言 本周在使用angular7所遇到的一些问题,学习是不断的循序渐进的过程,在本周完成对应的工作后,也要抽出一些时间用来学习,比较我们公司10点上班,我一般9点就会到,在这一个小时内看看博客,写写笔 ...
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...