网站首页 > 技术文章 正文
MySQL在创建索引的时候如果不指定排序方式默认是按照升序排列,这也是B+tree的默认规则。在MySQL8之前只能是按照升序排列,即使指定了倒序也不会生效,但是MySQL8之后新加了倒序索引,在某些特定场景下使用可以有效提高查询性能。
索引反向扫描
很多时候我们会根据时间进行倒序排序,但是建立的索引都是正序,所以对于MySQL来说会反向扫描数据排序,这个过程对单条sql来说性能影响不大,所以不用太担心,但是某些场景来说会有些影响。
具体分析
- sql分析
如下这条第一条sql,是根据CT建立的desc倒序查询,查询的时候根据CT倒序,那么这个时候MySQL就不会进行排序的操作,直接返回结果。
如果根据asc正序查询,那么MySQL就需要执行排序过程,这个过程就是filesort,filesort是MySQL的一个排序策略。虽然利用了索引,但是并不能直接完成排序。
要确定排序是否使用了filesort,可以看执行计划,如果Extra出现了Using filesort,Using temporary那么就是使用了filesort。filesort策略会产生临时表,对内存和磁盘是有影响的。
create index A on user(CT desc)
select * from user order by CT desc
EXPLAIN select * from user order by CT desc
- 深度分页
MySQL的深度分页时致命的,这个是由它本身的特性决定的,如果在深度分页的同时再遇到索引反向扫描,会严重加剧性能的损耗。数据量过大,亲测10W的数据量,索引排序方式对性能的影响在3到5毫秒之间。
- 数据量过大
数据量过大的时候如果使用索引排序,可能会导致索引失效或者查询速度很慢,失效或者慢的原因可能就是反向扫描导致的,如果建立和排序方式匹配的索引就可以避免。这个数据量过大是个相对概念,需要根据服务器硬件资源综合考虑,不能单纯以数据量大小来衡量。
- 高并发对内存和磁盘的使用占比升高
上面说的第一点,如果出发了filesort,那么就会产生临时表,数据量小的时候占用内存,数据量大的时候会使用磁盘,如果并发又很大,那么对系统必然会造成影响,严重降低系统的性能。
猜你喜欢
- 2025-07-27 MySql:DML数据操作语句盘点(数据库操作dml语句)
- 2025-07-27 MySQL消息系统铁三角:去重保序+死信队列破解重复消费与消息黑洞
- 2025-07-27 吃透3大Binlog模式,MySQL数据零丢失
- 2025-07-27 告别繁琐!MySQL数据搬家,这几招让你轻松搞定!
- 2025-07-27 MySQL基础篇:DQL数据查询操作(mysql查询教程)
- 2025-07-27 MySQL 生产流程监控咋选库?这俩常用工具手把手教你
- 2025-07-27 MySQL--多表连接查询(mysql多表连接查询时的关键字)
- 2025-07-27 MySQL--索引(mysql索引是什么)
- 2025-07-27 MySql:DQL 数据查询语句盘点(mysql查询语句菜鸟教程)
- 2025-07-27 MySQL大量脏数据,如何只保留最新的一条?
- 1518℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 597℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 521℃MySQL service启动脚本浅析(r12笔记第59天)
- 489℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 489℃启用MySQL查询缓存(mysql8.0查询缓存)
- 477℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 456℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 454℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)