关于MySQL数据库索引和ORDER BY子句的使用问题简介

在某些情况下,MySQL数据库能够直接利用索引来中意一个ORDER BY或GROUP BY子句而无需做额外的排序。尽管ORDER BY不是和索引的次序准确相称,索引还是能够被用到,因为凡是无须的索引局部和所有的额外的ORDER BY字段在WHERE子句中都被包括了。 本文我们主要介绍MySQL数据库中的索引和Order By子句的使用问题,接下来我们开始介绍。  

利用索引的MySQL Order By

下列的几个查询都会利用索引来处理 ORDER BY 或 GROUP BY 局部:

  1. SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;   
  2.  
  3. SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;   
  4.  
  5. SELECT * FROM t1 WHERE key_part1=constant GROUP BY key_part2;  
  6.  
  7.  SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;   
  8.  
  9. SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC; 

 

不利用索引的MySQL Order By  

在另一些情形下,MySQL无法利用索引来中意 ORDER BY,尽管它会利用索引来找到登记来相称 WHERE 子句。这些情形如下:

对不同的索引键做ORDER BY : SELECT * FROM t1 ORDER BY key1, key2;

在非继续的索引键局部上做 ORDER BY: SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;

同时利用了 ASC 和 DESC: SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

用于搜查登记的索引键和做 ORDER BY 的不是统一个: SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

有许多表同时做连接,而且读取的登记中在 ORDER BY 中的字段都不全是来自第一个极其数的表中(也即便说,在 EXPLAIN 分析的收获中的第一个表的连接种类不是 const)。

利用了不同的ORDER BY和GROUP BY表白式。

表索引中的登记不是按序存储。例如,HASH 和 HEAP 表即便这么。穿越厉行 EXPLAIN SELECT … ORDER BY,就懂得MySQL是否在查询中利用了索引。万一 Extra 字段的值是 Using filesort,则解释MySQL无法利用索引。

当定然对收获举行排序时,MySQL 4.1过去它利用了以下 filesort 算法:

1. 依据索引键读取登记,可能扫描数据表。那些无法相称 WHERE 分句的登记都会被略过。

2. 在缓冲中每条登记都用一个‘对’存储了2个值(索引键及登记指针)。缓冲的大小依据系统变量 sort_buffer_size 的值而定。

3. 当缓冲慢了时,就运行 qsort(迅速排序)并将收获存储在临时文件中。将存储的块指针保留起来(万一所有的‘对’值都能保留在缓冲中,就无需创立临时文件了)。

4. 厉行上面的垄断,直到所有的登记都读取出来了。

5. 做顺次多重并合,将多达 MERGEBUFF(7)个区域的块保留在另一个临时文件中。重复这个垄断,直到所有在第一个文件的块都放到第二个文件了。

6. 重复以上垄断,直到富余的块数量小于 MERGEBUFF2 (15)。

7. 在最后顺次多重并合时,只有登记的指针(排序索引键的最后局部)写到收获文件中去。

8. 穿越读取收获文件中的登记指针来按序读取登记。想要优化这个垄断,MySQL将登记指针读取放到一个大的块里,并且利用它来按序读取登记,将登记放到缓冲中。缓冲的大小由系统变量 read_rnd_buffer_size 的值而定。这个环节的代码在源文件 `sqlgexinghua.org/费雪records.cc’ 中。这个接近算法的一个问题是,数据库读取了2次登记:顺次是估价 WHERE 分句时,第二次是排序时。尽管第顺次都获胜读取登记了(例如,做了顺次全表扫描),第二次是随机的读取(索引键曾经排好序了,然而登记并未曾)。

在MySQL 4.1 及更新版本中,filesort 优化算法用于登记中不但包括索引键值和登记的位置,还包括查询中要求的字段。这么做避免了必需2次读取登记。改进的 filesort 算法做法大约如下:   

1. 跟随前一样,读取相称 WHERE 分句的登记。

2. 相对于每个登记,都登记了一个对应的;‘元组’消息消息,包括索引键值、登记位置、以及查询中所必需的所有字段。

3. 依据索引键对‘元组’消息举行排序。

4. 按序读取登记,不过是从曾经排序过的‘元组’列表中读取登记,而非从数据表中再读取顺次。 利用改进后的 filesort 算法相比本来的,‘元组’比‘对’必需挪借更长的空间,它们很少刚好合乎放在排序缓冲中(缓冲的大小是由 sort_buffer_size 的值定夺的)。因而,这就可能必需有更多的I/O垄断,导致改进的算法更慢。为了避免使之变慢,这种优化措施只用于排序‘元组’中额外的字段的大小总和超过系统变量 max_length_for_sort_data 的情形(这个变量的值设置太高的一个假象即便高磁盘负载低CPU负载)。

想要长进ORDER BY 的速度,率先要看MySQL能否利用索引而非额外的排序过程。万一不能利用索引,能够试着顺从以下计策:

添置sort_buffer_size 的值。

添置read_rnd_buffer_size 的值。

修正tmpdir,让它指向一个有许多富余空间的专用文件系统。

关于MySQL数据库Order By索引优化方面的知识就介绍到这里了,如果您想了解更多关于MySQL数据库的知识,可以看一下这里的文章:http://database./mysql/,相信一定能够带给您收获的!

【编辑推荐】

  1. 关于MySQL数据库创建内存表时的一些注意事项
  2. 详细介绍mysql-bin.000001文件的来源及处理方法
  3. MySQL数据库导入或导出时字符编码集的设置方法
  4. 关于MySQL数据库修改root用户使其远程登录的说明
  5. MySQL数据库正常插入并显示中文数据需满足的条件

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/283032.html<

(0)
管理的头像管理
上一篇2025-05-13 18:02
下一篇 2025-05-13 18:04

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注