MySQL 很有意思,发现我越来越喜欢它。不因为别的,就因为同事一个问题花一天,而我大多数情况下,我都能够避免。节约的时间,我可以用来学习其他的知识。



最近关注了一下 MySQL 的 order by 排序功能。发现了一些很有意思的事情,我们一起来分享一下。


1、排序字段有索引,无条件查询的情况下,竟然奇慢无比。

上面的查询语句中,name 字段有索引,但是查询效果和没索引一样。这是因为优化器认为走二级索引再去回表成本比全表扫描排序更高。所以选择走全表扫描。


2、在问题 1 的基础上,我添加一个 limit,结果又变快了。

太神奇了。紧紧加了一个 limit,效率变高了。这是因为无条件查询且 order by create_time limit m 中 m 值较小,是可以走索引的。因为优化器认为根据索引有序性去回表查数据,然后得到 m 条数据,就可以终止循环,那么成本比全表扫描小,则选择走二级索引。


3、在问题 2 的基础上,我们再把 name 上的索引去掉。结果也是比较快。


这是因为,即便没有二级索引,MySQL 针对 order by limit 也做了优化,采用堆排序。


4、同一条 SQL,为什么有时候排序很快,有时候很慢。

这个和扫描的行数有关系。如果扫描的行数过多,sort_buffer 这块内存放不下,就需要进行在磁盘中排序,也就是文件排序。内存和磁盘不是一个级别的。因此有时候慢,有时候快,是因为条件不一样。


总结,排序时,排序字段尽量加上索引。另外 limit 也很重要。除此之外,注意 where 条件。更多关于排序方面的内容,我后面再仔细讲。


©著作权归作者所有:来自51CTO博客作者mob604756f0e582的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 告别躺赢,我靠索引+函数
  2. 【MOS:1549181.1】为何在查询中索引未被使用--为什么索引没有被使
  3. Oracle的簇与簇表
  4. 痞子衡嵌入式:高性能MCU之音视频应用开发那些事 - 索引
  5. 因为我的一个低级错误,生产数据库崩溃了将近半个小时
  6. 悟透前端:javascript数组之includes、reduce
  7. 痞子衡嵌入式:语音处理工具pzh-speech诞生记 - 索引
  8. Python列表操作最全面总结
  9. MySQL之left join表查询中发生字符集转换导致表索引失效

随机推荐

  1. android的开发 华为手机上不显示menu键
  2. ListView的使用
  3. 建立一个简单的android涂鸦工程
  4. import android eclipse project to andr
  5. android TextView属性汇总
  6. Android 元素居中
  7. Android查看源码
  8. 获取Google Maps API 指纹证书时获取的是
  9. SQLiteDatabase 启用事务源码分析
  10. Android下图片或按钮等可拖动到任意位置