免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2541 | 回复: 5

网上找到的排序规则 [复制链接]

论坛徽章:
0
发表于 2010-03-16 10:11 |显示全部楼层
几个常用ORDER BY语句的MySQL优化:

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

[code=SQL]SELECT [column1],[column2],.... FROM [table] ORDER BY [sort] LIMIT [offset],[limit];[/code]

这个SQL语句优化比较简单,在[sort]这个栏位上建立索引即可。

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

[code=SQL]SELECT [column1],[column2],.... FROM [table] WHERE [columnX] = [value] ORDER BY [sort] LIMIT [offset],[limit];[/code]

这个语句,如果你仍然采用第一个例子中建立索引的方法,虽然可以用到索引,但是效率不高。更高效的方法是建立一个联合索引(columnX,sort)

3、WHERE + IN + ORDER BY + LIMIT组合的索引优化,形如:

[code=SQL]SELECT [column1],[column2],.... FROM [table] WHERE [columnX] IN ([value1],[value2],...) ORDER BY [sort] LIMIT [offset],[limit];[/code]

这个语句如果你采用第二个例子中建立索引的方法,会得不到预期的效果(仅在[sort]上是using index,WHERE那里是using where;using filesort),理由是这里对应columnX的值对应多个。

这个语句怎么优化呢?我暂时没有想到什么好的办法,于是就用了一个愚蠢的办法,那就是将这个语句用UNION分拆,然后建立第二个例子中的索引:

[code=SQL]SELECT [column1],[column2],.... FROM [table] WHERE [columnX]=[value1] ORDER BY [sort] LIMIT [offset],[limit]
UNION
SELECT [column1],[column2],.... FROM [table] WHERE [columnX]=[value2] ORDER BY [sort] LIMIT [offset],[limit]
UNION
……[/code]

4、不要再WHERE和ORDER BY的栏位上应用表达式(函数),比如:

SELECT * FROM [table] ORDER BY YEAR(date) LIMIT 0,30;

5、WHERE+ORDER BY多个栏位+LIMIT,比如

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

对于这个语句,大家可能是加一个这样的索引x,y,uid)。但实际上更好的效果是(uid,x,y)。这是由MySQL处理排序的机制造成的。

以上例子你在实际项目中应用的时候,不要忘记在添加索引后,用EXPLAIN看看效果。

论坛徽章:
0
发表于 2010-03-16 10:18 |显示全部楼层
第三条,,我不怎么认同噢。。。

大家呢?

论坛徽章:
0
发表于 2010-03-16 10:52 |显示全部楼层
第3条 union -》union all

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
发表于 2010-03-16 11:18 |显示全部楼层
第三条,,我不怎么认同噢。。。

大家呢?
james.liu 发表于 2010-03-16 10:18



    有问题,union出来的结果不是按照 sort来排序的。

论坛徽章:
0
发表于 2010-03-16 13:11 |显示全部楼层
有问题,union出来的结果不是按照 sort来排序的。
cenalulu 发表于 2010-03-16 11:18



   
你觉得应该怎么做呢?

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
发表于 2010-03-16 13:51 |显示全部楼层
没啥好办法。暂时想到一个,用程序先找出 in (v1,...v10) 里面的最大值和最小值,
然后改写语句为  WHERE [columnX]> [valueMIN] and [columnX] < [valueMAX]
然后对临时表再做 [columnX] in的操作。
当然这个也是视情况而定的,有些情况下可能效率会变的更低。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP