mysql按升序创建索引_MySQL 降序索引
发布日期:2021-06-24 15:37:01 浏览次数:2 分类:技术文章

本文共 4678 字,大约阅读时间需要 15 分钟。

MySQL 降序索引

简介:在本教程中,您将了解MySQL降序索引以及如何利用它来提高查询性能。

MySQL降序索引简介

降序索引是以降序存储键值的索引。在MySQL 8.0之前,您可以DESC在索引定义中指定。但是,MySQL忽略了它。与此同时,MySQL可以以相反的顺序扫描索引,但成本很高。

以下语句创建一个带索引的新表:

CREATE TABLE t(

a INT NOT NULL,

b INT NOT NULL,

INDEX a_asc_b_desc (a ASC, b DESC)

);

当您使用SHOW CREATE TABLE在MySQL 5.7,你会发现,DESC如下图所示被忽略:

mysql> SHOW CREATE TABLE t\G;

*************************** 1. row ***************************

Table: t

Create Table: CREATE TABLE `t` (

`a` int(11) NOT NULL,

`b` int(11) NOT NULL,

KEY `a_asc_b_desc` (`a`,`b`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

从MySQL 8.0开始,如果DESC在索引定义中使用关键字,则键值将按降序存储。在查询中请求降序时,查询优化器可以利用降序索引。

以下显示了MySQL 8.0中的表结构:

mysql> SHOW CREATE TABLE t\G;

*************************** 1. row ***************************

Table: t

Create Table: CREATE TABLE `t` (

`a` int(11) NOT NULL,

`b` int(11) NOT NULL,

KEY `a_asc_b_desc` (`a`,`b` DESC)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

1 row in set (0.00 sec)

MySQL降序索引示例

首先,使用不同顺序的四个索引重新创建表t:

DROP TABLE t;

CREATE TABLE t (

a INT,

b INT,

INDEX a_asc_b_asc (a ASC , b ASC),

INDEX a_asc_b_desc (a ASC , b DESC),

INDEX a_desc_b_asc (a DESC , b ASC),

INDEX a_desc_b_desc (a DESC , b DESC)

);

其次,使用下面的存储过程来插入行到t表:

DELIMITER $$

CREATE PROCEDURE insertSampleData(

IN rowCount INT,

IN low INT,

IN high INT

)

BEGIN

DECLARE counter INT DEFAULT 0;

REPEAT

SET counter := counter + 1;

-- insert data

INSERT INTO t(a,b)

VALUES(

ROUND((RAND() * (high-low))+high),

ROUND((RAND() * (high-low))+high)

);

UNTIL counter >= rowCount

END REPEAT;

END$$

DELIMITER ;

存储的过程中插入的行数(rowCount)与之间的值low和high到a和b所述列t表。

让我们10,000在t表中插入行,其中随机值介于1和1000之间:

CALL insertSampleData(10000,1,1000);

第三,从t表中查询具有不同排序顺序的数据:

按升序排列a和b列中的值:

EXPLAIN SELECT

*

FROM

t

ORDER BY a , b; -- use index a_asc_b_asc

这是输出:

+----+-------------+-------+------------+-------+---------------+-------------+---------+------+-------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+-------+---------------+-------------+---------+------+-------+----------+-------------+

| 1 | SIMPLE | t | NULL | index | NULL | a_asc_b_asc | 10 | NULL | 10192 | 100.00 | Using index |

+----+-------------+-------+------------+-------+---------------+-------------+---------+------+-------+----------+-------------+

1 row in set, 1 warning (0.03 sec)

按升序对a列中的值进行排序,按降序对列 b 中的值进行排序:

EXPLAIN SELECT

*

FROM

t

ORDER BY a , b DESC; -- use index a_asc_b_desc

输出是:

+----+-------------+-------+------------+-------+---------------+--------------+---------+------+-------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+-------+---------------+--------------+---------+------+-------+----------+-------------+

| 1 | SIMPLE | t | NULL | index | NULL | a_asc_b_desc | 10 | NULL | 10192 | 100.00 | Using index |

+----+-------------+-------+------------+-------+---------------+--------------+---------+------+-------+----------+-------------+

1 row in set, 1 warning (0.01 sec)

按降序对a列中的值进行排序,按升序对列 b 中的值进行排序:

EXPLAIN SELECT

*

FROM

t

ORDER BY a DESC , b; -- use index a_desc_b_asc

以下说明输出:

+----+-------------+-------+------------+-------+---------------+--------------+---------+------+-------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+-------+---------------+--------------+---------+------+-------+----------+-------------+

| 1 | SIMPLE | t | NULL | index | NULL | a_desc_b_asc | 10 | NULL | 10192 | 100.00 | Using index |

+----+-------------+-------+------------+-------+---------------+--------------+---------+------+-------+----------+-------------+

1 row in set, 1 warning (0.42 sec)

按列a和b降序对值进行排序:

EXPLAIN SELECT

*

FROM

t

ORDER BY a DESC , b DESC; -- use index a_desc_b_desc

以下显示输出:

+----+-------------+-------+------------+-------+---------------+---------------+---------+------+-------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+-------+---------------+---------------+---------+------+-------+----------+-------------+

| 1 | SIMPLE | t | NULL | index | NULL | a_desc_b_desc | 10 | NULL | 10192 | 100.00 | Using index |

+----+-------------+-------+------------+-------+---------------+---------------+---------+------+-------+----------+-------------+

1 row in set, 1 warning (0.01 sec)

在本教程中,您学习了如何使用MySQL降序索引来提高查询性能。

转载地址:https://blog.csdn.net/weixin_33608760/article/details/112037913 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:get 参数太长怎么办_新买的手表表带太长了该怎么办?表带调节操作方法get你~...
下一篇:mybatis获取表名_mybatis plus 的动态表名的配置详解

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月08日 16时37分07秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

2021最新计算机医学图像处理类毕业设计题目 2019-04-28
2021经典优秀计算机单片机毕业设计题目 2019-04-28
树莓派3B安装python3 opencv环境 2019-04-28
ubuntu21下ns3安装vscode代码不能智能提示问题 2019-04-28
zbar在win7下的编译及中文乱码解决 2019-04-28
Nature子刊:灵活的语音皮质编码可增强与任务相关的声学信息的神经处理 2019-04-28
大话脑影像:你真的了解你的眼动数据吗!—数据清洗的“神秘”力量 2019-04-28
大话脑影像:浅谈影像组学 2019-04-28
事件相关电位(ERP)在临床心理学中的运用 2019-04-28
了不起的K空间-cover懋式百科全书 2019-04-28
JAMA Psychiatry:大脑发育过程中与注意和情绪变化相关的内在结构性的改变 2019-04-28
《大话脑成像》之:独立成分分析 2019-04-28
Nature Neuroscience:确认偏见的神经机制 2019-04-28
Neuron:空间注意中的Alpha同步和神经反馈控制 2019-04-28
BRAIN脑电GCA研究:创伤后应激障碍患者的内源性感觉亢进和抑制缺失 2019-04-28
journal of neuroscience:面孔的神经表征与眼动模式相协调 2019-04-28
The Neuroscientist:运动性脑震荡的长期影响 2019-04-28
识别最优的数据驱动特征选择方法以提高分类任务的可重复性 2019-04-28
Lancet Neurology:脑成像在评估癫痫手术中的作用 2019-04-28
SLEEP:识别创伤后应激障碍病人睡眠的可重复的高密度EEG标识物 2019-04-28