您的位置:首页 > 数据库 > MySQL

MySQL Order By 使用索引的情况

2015-03-19 15:09 525 查看
最近看到有篇关于MySQL Order By的文章:http://www.cnblogs.com/anywei/archive/2011/12/12/mysql.html
,里面有好几点可疑的。

下面是我测试的结果,希望对大家有帮助:

原文:

1、ORDER BY的索引优化。如果一个SQL语句形如:

SELECT [column1],[column2],…. FROM ORDER BY [sort];

在[sort]这个栏位上建立索引就可以实现利用索引进行order by 优化。

自己测试的结果:这个要看查询的数据量,
	(1)查询全部数据的时候,即不使用limit的时候,会全表扫描,即使sort列上有索引;
	(2)当查询的数据占总表的5%的时候,使用limit的时候,会使用sort列上的索引,type=ref;


原文:

2、WHERE + ORDER BY的索引优化,形如:

SELECT [column1],[column2],…. FROM
WHERE [columnX] = [value] ORDER BY [sort];

建立一个联合索引(columnX,sort)来实现order by 优化。

自己测试的结果:
	(1)建立(columnX,sort)上的联合索引后,不论查询的结果占总数据量的多少,执行计划都会走该索引,type=ref;


注意:如果columnX对应多个值,如下面语句就无法利用索引来实现order by的优化

SELECT [column1],[column2],…. FROM
WHERE [columnX] IN ([value1],[value2],…) ORDER BY[sort];

自己测试的结果:
	(2)如果是 [columnX] IN ([value1],[value2],…) 这种情况,执行计划会走该索引,但是type=all;
	Using where; Using filesort


原文:

3、WHERE+ 多个字段ORDER BY

SELECT * FROM
WHERE uid=1 ORDER x,y LIMIT 0,10;

建立索引(uid,x,y)实现order by的优化,比建立(x,y,uid)索引效果要好得多。

自己测试的结果:
	(1)如果建立的是(uid,x)索引,也会用到这个索引,但是是Using where; Using filesort
	(2)如果建立的是(uid,x,y),和情况1中的一样,也会使用这个索引,而且没有 Using filesort
	(3)不是比建立(x,y,uid)索引效果好,而是根本不会走这个索引


还有

很多不确定的地方,例如,两个表做连接的时候,order by 走索引的方式?两个几十万的表做inner join,加limit 和不加 limit 以及 limit 的行数的多少都会引起执行计划的改变,以及EXPLAIN的 extra列里面的Using filesort,是按照limit 完后的结果集的大小与参数 max_heap_table_size,tmp_table_size设置的大小做比较,再决定是否出现的么?还有这个limit
的数据量 是按 总结果集的 多少比例,决定走不走 索引的?越测越糊涂了~~

希望 有对order by 有深刻理解的达人给介绍下。下面是 MySQL 官网对Order By的优化建议

http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: