- 浏览: 202849 次
- 性别:
- 来自: 重庆
文章分类
最新评论
用Explain分析SQL语句的时候,经常发现有的语句在Extra列会出现Using filesort,根据mysql官方文档对他的描述:
中文手册上翻译的很别扭:
总的来说,Using filesort 是Mysql里一种速度比较慢的外部排序,如果能避免是最好的了,很多时候,我们可以通过优化索引来尽量避免出现Using filesort,从而提高速度。
这里举个简单的例子:
`id` int(10) unsigned NOT NULL auto_increment,
`room_number` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `room_number` (`room_number`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE PROCEDURE `askwan`.`askwan` ()
BEGIN
DECLARE v INT DEFAULT 1;
WHILE v<100000;
DO
INSERT INTO testing VALUES(v,v);
SET v=v+1;
END WHILE;
END $$
Query OK, 1 row affected (13.21 sec)
OK,数据准备好了,开始试验。
由上面例子中建立的表信息,我已经建立了两个索引,一个主键id,一个room_number列索引
那现在来看一条SQL,
分析一下
mysql> EXPLAIN SELECT id FROM testing WHERE room_number=1000 ORDER BY id ;
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-----------------------------+
| 1 | SIMPLE | testing | ref | room_number | room_number | 4 | const | 1 | Using where; Using filesort |
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)
出现了Using filesort,并且用到了room_number这列索引,但是,在这里用到的索引是针对WHERE后面的room_number条件的,而最后面的排序是根据id来的,这就是手册中说的,“额外的一次排序”!,于是就会出现Using filesort,根据我以前写过的一文章,我再建立一个联合索引 room_number_id
在来分析一下
mysql> EXPLAIN SELECT id FROM testing WHERE room_number=1000 ORDER BY id ;
+----+-------------+---------+------+----------------------------+----------------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+----------------------------+----------------+---------+-------+------+--------------------------+
| 1 | SIMPLE | testing | ref | room_number,room_number_id | room_number_id | 4 | const | 1 | Using where; |
+----+-------------+---------+------+----------------------------+----------------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)
现在Using filesort不见了。
总结一下:
1.一般有order by语句,在索引加得不当的情况下,都有可能出现Using filesort,这时候就要对SQL语句和索引进行优化了,但是,并不是说出现Using filesort就是个严重的问题,不是这样的,此次举的例子比较极端,几乎不太可能出现这么傻瓜的查询,优化和不优化,要看它是不是影响了业务性能。
2. 从上面可以看到联合索引,也可以叫多列索引,形如 key ('A1','A2','A3' ,'A4')等的,排序的思路一般是,先按照A1来排序,A1相同,然后按照A2排序,以此类推,这样对于(A1),(A1,A2),(A1,A2,A3)的索引都是有效的,但是对于(A2,A3)这样的索引就无效了。
发表评论
-
分页,MySQL的SQL_CALC_FOUND_ROWS
2012-12-17 16:44 1346FOUND_ROWS() 函数 ,可以在调用包含LIMIT的 ... -
使用mysql的last_insert_id() 产生自增的id
2012-12-17 15:48 1082刚才查了下last_insert_id()相关资料,找到几篇不 ... -
innodb的记录锁、gap锁、next-key锁
2012-12-17 13:45 1387相关文章见: http://dev.mysql ... -
MySQL Innodb表死锁情况分析与归纳(转载)
2012-12-14 16:22 1938案例描述 在定时脚本运行过程中,发现当 ... -
MySQL连接超时
2012-12-13 20:41 1111在负载较重的MySQL服务器上,有时你偶尔会看到一些 ... -
IN条件结果顺序问题
2012-11-23 14:42 662项目中需要记录用户的浏览历史,我的意见是前端直接存cook ... -
mysql那点事(行锁+not null + varchar)
2012-10-12 15:08 1649一。not null vs DEAFUL value ... -
关于mysql auto_increment所带来的锁表操作
2012-09-01 14:00 1605以前内容主要是对官方文档中的意译,并加入了一些自己的理解 ... -
mysql 与unicode
2012-08-29 15:36 1680UTF8字符集(转换Unicode表示)是存储Unico ... -
深入Mysql字符集设置
2012-08-29 14:46 55805 Jan 08 深入Mysql字符集设置 ... -
关于set names
2012-08-29 14:37 808<?php$conn=mysql_connect( ... -
MYSQL索引优化和in or替换为union all
2012-08-22 17:16 4041一个文章库,里面有两个表:category和article。c ... -
mysql读写分离(PHP类)
2012-08-18 18:08 3605自己实现了php的读写 ... -
mysql分表的3种方法
2012-08-02 14:39 829当一张的数据达到几百万时,你查询一次所花的时间会变多,如 ... -
MySql BLOB类型
2012-08-02 13:42 706MySql的Bolb四种类型 MySQL中,BLOB是一个二进 ... -
MySQL 查询优化技巧
2012-07-18 20:26 754瓶颈 众所周知,几乎所有大型项目的最终效率瓶颈,都来自 ... -
mysql多表联合查询
2012-07-18 19:16 1636我在工作中天天研究zen cart的程序,那个叫人痛苦,最近比 ...
相关推荐
group by什么时候会出现Using filesort — 理论3 order by 和 group by什么时候会出现Using filesort — 实践3.1 不会出现 Using filesort的情况 — 符合最佳左前缀法则3.1.1 order by也满足索引最佳左前缀法则的...
语法格式如下 EXPLAIN tbl_name 或者: EXPLAIN SELECT select_options EXPLAIN 语句可以被当作 DESCRIBE 的同义词来用,也可以用来获取一个MySQL要执行的 SELECT 语句的相关信息。 EXPLAIN tbl_name 语法和 DESCRIBE...
主要包括order by关键字排序优化(无过滤不排序;顺序错,必排序;方向反,必排序;索引的选择;using filesort以及覆盖索引等内容)、group by关键字优化
mysql中using的用法为: using()用于两张表的join查询,要求using()指定的列在两个表中均存在,并使用之用于join的条件。 示例: ... 您可能感兴趣的文章:Mysql之EXPLAIN显示using filesort介绍mys
MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描。利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作。当索引的顺序与ORDER BY中的列顺序相同且所有的列是同...
本篇文章我们将了解ORDER BY语句的优化,在此之前,你需要对索引有基本的了解,不了解的老少爷们可以先看一下我之前写过的索引相关文章。现在让我们开始吧。 MySQL中的两种排序方式 1.通过有序索引顺序扫描直接返回...
在MySQL查询语句过程和EXPLAIN语句基本概念及其优化中介绍了EXPLAIN语句,并举了一个慢查询例子: 可以看到上述的查询需要检查1万多记录,并且使用了临时表和filesort排序,这样的查询在用户数快速增长后将成为噩梦...
selectbgidfrombigtorderbybgname;CreateTable:CREATETABLE`bigt`(`bgid`int(10)unsignedNOTNULLAUTO_INCREMENT,`bgname`varchar(100)DEFAULTNULL,`status`tinyint(4)DEFAULT’0′,PRIMARYKEY(`bgid`))ENGINE=...
今天以前的同学问我关于这方面的SQL语句,我特意记忆一下,毕竟这个也比较常见了 代码如下:select * from ... Using filesort 代码如下:select s.* from (SELECT max(id) as id FROM `member_payment` group by `
filesort
会经常发现开发人员查一下没用索引的语句或者没有limit n的语句,这些没语句会对数据库造成很大的影响,例如一个几千万条记录的大表要全部扫描,或者是不停的做filesort,对数据库和服务器造成io影响等。这是镜像库...
在mysql中,通常使用limit做分页,而且经常会跟order by 连用。在order by 上加索引有时候是很有帮助的,不然系统会做很多的filesort
前言 在 MySQL 中,线程独享内存主要用于各客户端连接线程存储各种操作...MySQL 用此内存区域进行排序操作(filesort),完成客户端的排序请求。当我们设置的排序区缓存大小无法满足排序实际所需内存的时候,MySQL 会将
安装npm install typescript-filesort选项options.files 文件路径数组。 options.normalize :它将使用path节点模块规范化所有文件路径options.compiler :让您将选项传递给 TS 编译器。 默认是 noLib用法 var ...
python读取指定文件夹下的Landsat遥感影像,并按照时间对影像文件名排序
Gulp TypeScript Filesort 这是一个简单的 gulp 插件,它使用 Typescript 编译器 API 对 TS 文件进行排序。 不要在生产环境中使用它,因为它没有经过实战测试并且只响应一个简单的用例。 安装 npm install gulp-...
filesort:按多个键对文本文件进行排序。 2. controlbreak:读取排序文件并构建控制中断和求和。 对于 filesort 和 controlbraek,您需要一个 csv 文件。 您可以找到适用于 Linux 和 Windows 的二进制文件。 与...
namespace ConsoleApplication1{ /// /// 文件排序类 /// public class FileSort : IComparer { private FileOrder _fileorder; private FileAsc _fileasc; /// /// 构造函数 ///