赞
踩
最近看到有篇关于MySQL Order By的文章:http://www.cnblogs.com/anywei/archive/2011/12/12/mysql.html ,里面有好几点可疑的。
下面是我测试的结果,希望对大家有帮助:
原文:
1、ORDER BY的索引优化。如果一个SQL语句形如:
SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];
在[sort]这个栏位上建立索引就可以实现利用索引进行order by 优化。
自己测试的结果:这个要看查询的数据量,
(1)查询全部数据的时候,即不使用limit的时候,会全表扫描,即使sort列上有索引;
(2)当查询的数据占总表的5%的时候,使用limit的时候,会使用sort列上的索引,type=ref;
原文:
2、WHERE + ORDER BY的索引优化,形如:
SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort];
建立一个联合索引(columnX,sort)来实现order by 优化。
自己测试的结果:
(1)建立(columnX,sort)上的联合索引后,不论查询的结果占总数据量的多少,执行计划都会走该索引,type=ref;
SELECT [column1],[column2],…. FROM [TABLE] 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 [table] 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 有深刻理解的达人给介绍下。下面是 MySQL 官网对Order By的优化建议
http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。