一条SQL引发的对order by的思考
在实际工作中遇到下面一个问题:
有一个表,存有2000万数据。
主键为ID bigint(20) NOT NULL auto_increment
另有一字段time timestamp NOT NULL default CURRENT_TIMESTAMP
故事从这两个字段说起:
sql1需要从这个表中检索出来时间为2010-05-26 11:55:00之前并且id号大于20000的前10条数据
sql2需要从这个表中检索出来时间为2010-05-26 11:55:00之后并且id号大于20000的前10条数据
两条sql写出来大概是这样子的:
sql1:select * from table where time 20000 order by id limit 10;
sql2:select * from table where time >’2010-05-26 11:55:00′ and id>20000 order by id limit 10;
并且已经知道表中的数据,在上面所示时间之前的数据要远远多于所示时间之后的数据。如图1所示:

图1 数据在时间线上的示意图
实测发现,sql1执行时间0.03s,sql2执行时间33s。
为何大于小于运行的速度相比如何巨大?下面来解答。
第一,用explain来观察两条sql的区别
结论:没什么区别
第二,研究order by
将sql2的order by id修改为order by id desc(排序方向颠倒)后,发现速度马上提到了0.03s的水平。
同样修改sql1的时候,速度马上降到了30s的水平。
进行多次测试,排除mysql本身的缓存干扰。
结论:
sql1的运行示意图如图2所示:

图2 第一条SQL语句快慢解释图
sql2的运行示意图如图3所示:

图2 第二条SQL语句快慢解释图
综合上面两个图,mySQL在where查询的时候,也许按照where的条件,按照主键的顺序,最后满足条件的,最后进到内存中去,再进行后面的order by时,asc如果在内存中比不在内存中的就要快得多。
未研究真正实现的代码,仅凭感觉验证。
一句话概括是:按照使用的索引,最后满足条件的数据将留在内存里供进一步排序。
建议继续学习:
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:54chen 来源: 五四陈科学院-坚信科学,分享技术
- 标签: order
- 发布时间:2010-07-06 23:26:30
-
[881] WordPress插件开发 -- 在插件使用 -
[136] 解决 nginx 反向代理网页首尾出现神秘字 -
[57] 整理了一份招PHP高级工程师的面试题 -
[54] Innodb分表太多或者表分区太多,会导致内 -
[54] 分享一个JQUERY颜色选择插件 -
[54] 用 Jquery 模拟 select -
[54] 如何保证一个程序在单台服务器上只有唯一实例( -
[52] jQuery性能优化指南 -
[52] CloudSMS:免费匿名的云短信 -
[51] 全站换域名时利用nginx和javascri
