mysql优化索引 —— Using filesort
来源:互联网 发布:数控龙门铣床编程指令 编辑:程序博客网 时间:2024/06/03 02:09
用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
写个存储过程askwan,插入10万条测试数据
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优化索引 —— Using filesort
- mysql优化索引 —— Using filesort
- MySQL 索引优化 Using where, Using filesort
- mysql优化(四)mysql优化索引--Using filesort
- MySQL 调优 —— Using filesort
- mysql using filesort
- MySql中explain的时候出现using filesort,优化之
- MySql中explain的时候出现using filesort,优化之
- MySql中explain的时候出现using filesort,优化之
- 优化MySql中explain的时候出现using filesort
- MySQL优化之filesort
- mysql 优化(消除filesort)
- mysql explain中的using filesort
- mysql using filesort 的解决方案
- mysql explain中的using filesort
- mysql查询优化--临时表和文件排序(Using temporary; Using filesort问题解决)
- MySQL explain 的Using temporary; Using filesort
- MySQL filesort优化案例一则
- 参考文献格式
- 深入浅出WPF.刘铁猛(奋斗的小鸟)_PDF 电子书
- 按钮超链接
- 数据库使用中一些问题解决记录
- 视频采集与运动检测源码
- mysql优化索引 —— Using filesort
- HQL查询
- 安卓组权限总结
- C# 中的委托和事件
- 委托事件你会用了吗?
- zImage内核镜像解压过程详解
- Source Taste: Struts 2 ActionContext
- xcode4的多视图应用
- ---ffmpeg 编译错误解决方法-