0

0

mysqlfilesort介绍

php中文网

php中文网

发布时间:2016-06-07 16:18:30

|

1323人浏览过

|

来源于php中文网

原创

在MySQL中的ORDER BY有两种排序实现方式: 1、利用有序索引获取有序数据 2、文件排序 在使用explain分析查询的时候,利用有序索引获取有序数据显示Using index。而文件排序显示Using filesort。 1.利用有序索引获取有序数据 取出满足过滤条件作为排序条件的字

   在mysql中的order by有两种排序实现方式:

  1、利用有序索引获取有序数据

  2、文件排序

  在使用explain分析查询的时候,利用有序索引获取有序数据显示Using index。而文件排序显示Using filesort。

  1.利用有序索引获取有序数据

  取出满足过滤条件作为排序条件的字段,以及可以直接定位到行数据的行指针信息,在 Sort Buffer 中进行实际的排序操作,然后利用排好序的数据根据行指针信息返回表中取得客户端请求的其他字段的数据,再返回给客户端.

  这种方式,在使用explain分析查询的时候,显示Using index。而文件排序显示Using filesort。

  注意:MySQL在查询时最多只能使用一个索引。因此,如果WHERE条件已经占用了索引,那么在排序中就不使用索引了。

  1.1 按照索引对结果进行排序:order by 使用索引是有条件

  1) 返回选择的字段,即只包括在有选择的此列上(select后面的字段),不一定适应*的情况):

  CREATE TABLE `test` (

  `id` int(11) NOT NULLAUTO_INCREMENT,

  `rdate` datetime NOT NULL,

  `inventid` int(11) NOT NULL,

  `customerid` int(11) NOT NULL,

  `staffid` int(11) NOT NULL,

  `data` varchar(20) NOT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `rdate`(`rdate`,`inventid`,`customerid`),

  KEY `inventid` (`inventid`),

  KEY `customerid` (`customerid`),

  KEY `staffid` (`staffid`)

  ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=latin1

  mysql>

  explain select inventid from test where rdate='2011-12-1400:00:00' order by inventid , customerid;

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

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

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

  | 1 | SIMPLE | test |ref | rdate |rdate | 8 |const | 10 | Using where; Using index |

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

  1 row in set (0.00 sec)

  Select选择的列使用索引,而下面不使用索引:

  mysql> explain select * from test where rdate='2011-12-14 00:00:00'order by inventid , customerid ;

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

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

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

  | 1 | SIMPLE | test | ALL | rdate | NULL | NULL |NULL | 13 |Using where;Using filesort|

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

  2) 只有当ORDER BY中所有的列必须包含在相同的索引,并且索引的顺序和order by子句中的顺序完全一致,并且所有列的排序方向(升序或者降序)一样才有,(混合使用ASC模式和DESC模式则不使用索引)

  mysql>

  xplain select inventid from test order byrdate, inventid ;

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

html动物介绍滑块切换页面模板
html动物介绍滑块切换页面模板

一款html动物介绍滑块切换页面模板

下载

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

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

  | 1 | SIMPLE | test | index | NULL | rdate |16 | NULL | 13 |Using index|

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

  1 row in set (0.00 sec)

  mysql>

  explain select inventid from test where rdate="2011-12-16" order by inventid ,staffid;

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

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

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

  | 1 | SIMPLE | test | ref | rdate | rdate | 8 | const | 1 |Using where;Using filesort

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

  1 row in set (0.00 sec)

  由于rdate, inventid使用了同一个索引。排序使用到了索引。这个也是满足了前缀索引。但是order by inventid ,staffid;就不是使用了索引,因为staffid和inventid不是同一个索引

  3) where 语句与ORDER BY语句组合满足最左前缀:

  mysql>

  explain select inventid from test whererdate="2011-12-16" order by inventid ;

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

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

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

  | 1 | SIMPLE | test | ref | rdate | rdate | 8 | const | 1 | Using where;Using index|

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

  1 row in set (0.00 sec)

  4) 如果查询联接了多个表,只有在order by子句的所有列引用的是第一个表的列才可以。

  5) 在其他的情况下,mysql使用文件排序 例如:

  1) where语句与order by语句,使用了不同的索引

  2) 检查的行数过多,且没有使用覆盖索引

  3) ORDER BY中的列不包含在相同的索引,也就是使用了不同的索引

  4) 对索引列同时使用了ASC和DESC

  5) where语句或者ORDER BY语句中索引列使用了表达式,包括函数表达式

  6) where 语句与ORDER BY语句组合满足最左前缀,但where语句中使用了条件查询。查见第10句,虽然where与order by构成了索引最左有缀的条件,但是where子句中使用的是条件查询。

  mysql> explain select inventid from test where rdate>"2011-12-16" order by inventid;

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

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

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

  | 1 |SIMPLE | test | range | rdate | rdate | 8 | NULL | 1 | Using where; Using index;Usingfilesort|

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

  1 row in set (0.00sec)

  7) 当使用left join,使用右边的表字段排序

  2.文件排序

  这个 filesort 并不是说通过磁盘文件进行排序,而只是告诉我们进行了一个排序操作。即在MySQL Query Optimizer 所给出的执行计划(通过 EXPLAIN 命令查看)中被称为文件排序(filesort)

相关专题

更多
菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

56

2026.01.21

三角洲入口地址合集
三角洲入口地址合集

本专题整合了三角洲入口地址合集,阅读专题下面的文章了解更多详细内容。

51

2026.01.21

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

397

2026.01.21

妖精漫画入口地址合集
妖精漫画入口地址合集

本专题整合了妖精漫画入口地址合集,阅读专题下面的文章了解更多详细内容。

118

2026.01.21

java版本选择建议
java版本选择建议

本专题整合了java版本相关合集,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

11

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.4万人学习

Bootstrap4.x---十天精品课堂
Bootstrap4.x---十天精品课堂

共22课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号