MySql ORDER BY 索引优化

从BIOS到路由器:深入拆解SPI NOR Flash的硬件连接与‘芯片内执行’(XIP)奥秘 本文深入解析SPI NOR Flash的硬件连接与‘芯片内执行’(XIP)技术,从BIOS到路由器的应用场景出发,详细介绍了其架构精髓、典型连接方案、时序设计及性能优化方法。通过实际案例和参数对比,帮助开发者掌握NOR Flash在嵌入式系统中的关键作用与设计技巧,提升电路设计效率与可靠性。 阅读详情

上一篇:MySql 索引优化

MySql 支持两种方式的排序,FileSort 和 Index ,Index 效率高,它指的是 MySql 扫描索引本身完成排序。FileSort 会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。因此效率很低。在我们使用 ORDER BY 子句进行排序查找时,要使用 Index 的方式排序,避免 FileSort 方式排序。

我在 t_emp 表上建立了一个复合索引,其中包含 age 字段与 sex 字段。

+-------+------------+----------------+--------------+-------------+-----------+-------------+-
| Table | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality |
+-------+------------+----------------+--------------+-------------+-----------+-------------+-
| t_emp |          0 | PRIMARY        |            1 | id          | A         |           3 |
| t_emp |          1 | idx_emp_ageSex |            1 | age         | A         |           3 |
| t_emp |          1 | idx_emp_ageSex |            2 | sex         | A         |           3 |
+-------+------------+----------------+--------------+-------------+-----------+-------------+-

接下来我们就使用 EXPLAIN 关键字查看 Extra 中的值,判断 SQL 语句需不需要优化 (为了排版的问题,这里省略了 EXPLAIN 中的一些属性,下同)。当我们使用 age 排序时,可以知道使用了我们建立的索引,并且 Extra 中的值为:Using index condition 。

mysql> EXPLAIN SELECT* FROM t_emp WHERE age>20 ORDER BY age;
+-------+----------------+----------------+---------+------+------+----------+-----------------------+
| type  | possible_keys  | key            | key_len | ref  | rows | filtered | Extra                 |
+-------+----------------+----------------+---------+------+------+----------+-----------------------+
| range | idx_emp_ageSex | idx_emp_ageSex | 5       | NULL |    2 |   100.00 | Using index condition |
+-------+----------------+----------------+---------+------+------+----------+-----------------------+

下面这段 SQL 我们使用 age 与 sex 排序,同样使用了索引,Extra 中的值为:Using index condition 。

mysql> EXPLAIN SELECT* FROM t_emp WHERE age>20 ORDER BY age,sex;
+-------+----------------+----------------+---------+------+------+----------+-----------------------+
| type  | possible_keys  | key            | key_len | ref  | rows | filtered | Extra                 |
+-------+----------------+----------------+---------+------+------+----------+-----------------------+
| range | idx_emp_ageSex | idx_emp_ageSex | 5       | NULL |    2 |   100.00 | Using index condition |
+-------+----------------+----------------+---------+------+------+----------+-----------------------+

当我们按照 sex age 的顺序进行排序时,虽然使用了索引,但是 Extra 中却出现了 Using Filesort。这样的排序查找方式是不好的。

mysql> EXPLAIN SELECT* FROM t_emp WHERE age>20 ORDER BY sex,age;
+---------+------+------+----------+---------------------------------------+
| key_len | ref  | rows | filtered | Extra                                 |
+---------+------+------+----------+---------------------------------------+
| 5       | NULL |    2 |   100.00 | Using index condition; Using filesort |
+---------+------+------+----------+---------------------------------------+

从上面三条 SQL 的执行结果可以看出要想不使用 Using Filesort 排序,ORDER BY 语句要符合最佳左前缀原则。

</font size = 3> 我们再来看,当我们的 ORDER BY 语句不符合最佳左前缀法则时查询的结果是什么样的?下面的演示分别对 age 做固定查找与做范围查找,我们可以看出当使用范围查找时使用了 Filesort ,尽管在做固定查找时 ORDER BY 没有符合最佳左前缀原则,但是也是只使用了 Using index。

mysql> EXPLAIN SELECT* FROM t_emp WHERE age = 20 ORDER BY sex;
+------+----------------+----------------+---------+-------+------+----------+-----------------------+
| type | possible_keys  | key            | key_len | ref   | rows | filtered | Extra                 |
+------+----------------+----------------+---------+-------+------+----------+-----------------------+
| ref  | idx_emp_ageSex | idx_emp_ageSex | 5       | const |    1 |   100.00 | Using index condition |
+------+----------------+----------------+---------+-------+------+----------+-----------------------+
mysql> EXPLAIN SELECT* FROM t_emp WHERE age>20 ORDER BY sex;
+----------------+---------+------+------+----------+---------------------------------------+
| key            | key_len | ref  | rows | filtered | Extra                                 |
+----------------+---------+------+------+----------+---------------------------------------+
| idx_emp_ageSex | 5       | NULL |    2 |   100.00 | Using index condition; Using filesort |
+----------------+---------+------+------+----------+---------------------------------------+

因此,使用 WHERE 子句与 ORDER BY 子句条件列组合满足索引最佳左前缀法则也是可以提高查询效率的。但是 WHERE 子句查找条件不能使范围筛选。

下面我们就来看一看 Filesort 的两种排序算法:
双路排序:在 MySql 4.1 之前是使用双路排序,双路排序是指两次扫描磁盘,最终得到数据。读取行指针和 orderby 列,对它们进行排序,然后扫描已经排好序的列表,按照列表中的值重新获取列表中读取对应的数据输出。可见双路排序当操作一批数据时,会对磁盘进行两次扫描,由于 I/O 资源是很消耗时间的,因此在 MySql4.1 之后,出现了一种改进的算法,就是单路排序。

单路排序:从此磁盘中查询所需要的列,按照 orderby 列在 buffer 中对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并把随机 I/O 变成了顺序 I/O,但是它会使用更多的空间,因为它把每一行数据都保存在了内存中。

【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读 本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的实战方法。当数据不满足正态分布等参数检验假设时,通过将协变量和因变量转换为秩,并利用秩回归残差进行Kruskal-Wallis组间比较,提供了一种清晰、可操作的近似解决方案。该方法有效解决了非正态数据的协变量调整问题,适用于实验研究和调查数据分析。 阅读详情

相关推荐

Tesseral 建立地震模型

0. 前言 本节内容主要是总结如何使用 Tesseral 工具建立模型。 1. 模型建立步骤 设置模型的宽度和深度 此处默认都为1000,之后点击“确定” 建立地层 绘制新的地层 右键点击“New polygon” 绘制地层,设置第二个层的名字和纵波速度 绘制第三层,第三层覆盖在前一个层上 第四层如上,第四层如果是最后一层,绘制该层时,要将深度1000包围。 设置观测系统 设置炮点 设置子波为雷克子波,频率设置为30 检波点设置 运行模型 设置好如上选择后,

weixin_41857483的博客 6539

MySql使用order by会不会走索引?

需要判断查询的返回字段是否被索引覆盖, 如果全部被索引覆盖了那么就会走索引,如果没有全部覆盖mysql 就会根据数据量的大小来判断是否进行全表扫描或者先走索引再回表查询。本文引用:mysql使用order by会不会走索引?_骑电动车的小黄的博客-优快云博客。

xiaoshitou_2015的博客 2649

从FinFET到NanoSheet:一文看懂TSMC制程技术的架构革命与性能飞跃

本文深入解析了TSMC从FinFET到NanoSheet的制程技术架构革命。FinFET通过三维立体结构解决了短沟道效应,而NanoSheet采用环绕栅极设计,实现了更强的静电控制与设计灵活性,结合EUV光刻技术,共同推动了芯片性能与能效的飞跃,为下一代AI与高性能计算奠定基石。

i3j4k5的博客 287

MySQL中的ORDER BY

MySQL中的ORDER BY ​ 当我们使用SELECT语句查询某个数据库的单个列时,如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会收到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖该排序顺序。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。 ​ 为了明确地排序用SELECT语句检索出的数据,可以使用ORDER BY子句。ORDER BY子句

qq_43752126的博客 1万+

初识机会网络仿真器ONE中ExternalMovement移动模型(导入外部移动数据)

最近半个月一直在研究ONE中关于ExternalMovement移动模型的源代码,在网上几乎没有找到相关的资料,很是苦恼,如果有共同研究方向的小伙伴欢迎联系我,共同讨论进步。 下面记录一下几点感悟: 1、使用外部数据的前提是在ONE的配置文件中增加及修改相关代码: Group.movementModel = ExternalMovement ExternalMovement.file = move...

qq_36974792的博客 655

Claude Code 常见安装失败问题与解决办法

摘要: Claude Code安装失败通常与环境、网络和权限问题有关,而非软件本身。主要误区包括:命令未识别(需检查PATH和终端重启)、网络连接失败(终端代理配置)、权限不足(系统安全限制)及账号认证问题。首次使用应避免复杂任务,建议从基础功能测试开始。快速自检可按终端重启→命令识别→网络→代理→权限→账号状态的顺序排查。理顺终端、网络和权限后,Claude Code运行将更稳定。 (150字)

sg_knight的专栏 6692

MySQL之orderby详解

MySQL中

qq_40276626的博客 1万+

算法 | A*算法实现最优路径规划

启发式探索是利用问题拥有的启发信息来引导搜索,达到减少探索范围、降低问题复杂度的目的。A*寻路算法是启发式探索的一个典型实践,在寻路搜索的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中采取估计值优先原则,估计值更优的节点会被优先遍历。...

不断学习,不断进步,提高自己 6629

MySQL order by关键字详解,order by排序

关键字一、order by 简介1)order by 的作用2)语法格式二、order by 使用1)按照字段名排序2)按照索引进行排序3)降序4)按照多列排序一、order by 简介ORDER BY 关键字用于对结果集进行「排序」。1)order by 的作用ORDER BY 关键字可以使查

libaiup的博客 2万+

基于YOLOv8的应急通道占用监测系统设计与实现

通过详细的数据集选择、模型训练、代码实现等内容,本博客为您提供完整的系统搭建过程,帮助您构建高效的监测系统。然而,在一些建筑物和公共场所中,应急通道经常被不当占用,导致紧急情况下无法及时使用,严重影响人员的疏散效率。YOLOv8是YOLO系列中的最新版本,它通过引入深度学习的优化和改进,在保证检测速度的同时,显著提升了检测精度。同时,随着深度学习技术的不断发展,检测精度与速度的提升将使得该系统在更广泛的场景中应用。:如果已有监控设备,可以采集应急通道的实时视频,并进行标注,生成占用监测数据集。

YOLO 797

Linux系统之部署经典魔塔小游戏

Linux系统之部署经典魔塔小游戏

jks212454的博客 1811

《算法》-排序[优先队列(堆排序)]

优先队列(堆排序) 优先队列:最重要的操作就是删除最大元素和插入元素 堆排序:堆排序对于记录较少的文件效果一般,对于文件较多还是比较有效的,最差的时间复杂度为nlog(n),属于不稳定排序 堆排序可以被认为是一种改进的选择排序:就像选择算法一样,它将输入分成已排序的和还未排序的区域,它通过提取未排序的区域内最大的元素并将其移动到已排序的区域来迭代缩小未排序的区域。堆排序相对选择排序改进的部分包括使用堆数据结构而不是线性时间的搜索来找到最大值。摘于知乎:堆排序 步骤: 输入:一系列的无序元素(.

m0_37748303的博客 707

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MySQL索引系列--索引的优化--ORDER BY

本文介绍MySQL的ORDER BY索引的优化方案。 MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。 MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。

IT利刃出鞘的博客 6868

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MySQL如何利用索引优化ORDER BY排序语句

MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。通过索引优化来实现MySQL的ORDER BY语句优化:1、ORDER BY的索引优化。如果一个SQL语句形如:SELECT [column1],[column2],…. FROM [TABLE

红黄蓝的技术生活 3万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

mysql 联合索引order_MySQL如何利用索引优化ORDER BY排序语句

官网排序优化:http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.htmlMySql创建索引时支持ASC或DESC排序。实例展示创建表时同时创建索引降序排序(sname 字段上普通索引降序)create tabletbl1 (idint unique, sname varchar(50),index tbl1_index_sna...

weixin_36312271的博客 1544

MySQL利用索引优化ORDER BY

MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化。如果一个SQL语句形如: SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort]; 在[sort]这个栏位上建立索引就可以实现利用索引进行order by ...

weixin_41172436的博客 601

mysql order by 多个字段 索引_mysql 索引优化order by 语句

MySql创建索引时支持ASC或DESC排序。下面举例创建表时同时创建索引降序排序(sname 字段上普通索引降序)create table tbl1 (id int unique, sname varchar(50),index tbl1_index_sname(sname desc));在已有的表创建索引语法create [unique|fulltext|spatial] index 索引名o...

weixin_35082950的博客 2782

MySQL利用索引优化ORDER BY排序语句

创建表&创建索引 1 2 3 4 createtabletbl1( idintunique,snamevarchar(50), indextbl1_index_sname(snamedesc) ); 在已有的表创建索引语法 create [unique|fulltext|spat...

大数据基础框架学习教程汇集 796

MySQL--索引的优化--ORDER BY

在MySQL中,ORDER BY语句的性能优化是一个重要的课题,尤其是在处理大数据集时,如果ORDER BY没有正确使用索引,可能会导致全表扫描或文件排序(Using filesort),从而严重影响查询性能。以下是一些详细的优化策略和示例。

zx733988的博客 1188

mysql索引 order by_MySQL Order By索引优化方法

尽管 ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的 ORDER BY 字段在 WHERE 子句中都被包括了。使用索引的MySQL Order By下列的几个查询都会使用索引来解决 ORDER BY 或 GROUP BY 部分:SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;SELECT * F...

weixin_30387211的博客 471

mysql索引优化order_MySQL利用索引优化ORDER BY排序语句的方法

创建表&创建索引create table tbl1 (id int unique, sname varchar(50),index tbl1_index_sname(sname desc));在已有的表创建索引语法create [unique|fulltext|spatial] index 索引名 on 表名(字段名 [长度] [asc|desc]);MySQL也能利用索引来快速地执行OR...

weixin_39972996的博客 182

mysql 索引order,MySQL如何利用索引优化ORDER BY排序语句

MySQL如何利用索引优化ORDER BY排序语句MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。通过索引优化来实现MySQL的ORDER BY语句优化:1、ORDER BY的索引优化。如果一个SQL语句形如:SELECT [column1],[colu...

weixin_29081101的博客 498

mysql order by索引优化_MySQL如何利用索引优化ORDER BY排序语句

MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。通过索引优化来实现MySQL的ORDER BY语句优化:1、ORDER BY的索引优化。如果一个SQL语句形如:SELECT [column1],[column2],…. FROM [TABLE] ORDE...

weixin_36277530的博客 110

MySQL如何利用索引优化ORDER BY排序语

MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。 MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化。如果一个SQL语句形如: SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort]; 在[sort]这个栏位上建立索引就可以实现利用索引进行order by

wr_java的博客 180

MySQL Order By索引优化

MySQL Order By索引优化 MySQL可以直接使用索引来满足一个ORDER BY 子句而无需做额外的排序。尽管 ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到。 在一些情况下,MySQL可以直接使用索引来满足一个 ORDER BY 或 GROUP BY 子句而无需做额外的排序。尽管 ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所

shao.bing的专栏 702

mysql group by 索引优化_MySQL Order By索引优化方法

在一些情况下,MySQL可以直接使用索引来满足一个 ORDER BY 或 GROUP BY 子句而无需做额外的排序尽管 ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的 ORDER BY 字段在 WHERE 子句中都被包括了。使用索引的MySQL Order By下列的几个查询都会使用索引来解决 ORDER BY 或 GROUP BY 部分:SELE...

weixin_39936403的博客 177
上一篇: MySQL使用SHOW PROFILE进行SQL分析
下一篇: Java 堆内存优化
留兰香丶
博客等级 码龄9年 391粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值