今天遇到个奇葩的问题,

sql 数据量很大 有where 和order by,不加order by 速度很快,加了就很慢

一、首先我们对这条sql执行查询计划:

 explain select t.order_id from book_order t  ORDER BY t.order_id desc 

explain select t.order_id from book_order t 

这条语句应用的索引是idx_bo_order_book_local

进一步确定,再对使用where条件后,索引变成了主键。

explain select t.order_id from book_order t where t.order_id = 1593539

通过以上的情况可以看出:

MySQL默认的查询(没有where条件),不一定使用主键,由于MySQL的每一条简单查询只应用一个索引,所以,这个时候使用order by 主键,主键的索引功能失效。

二:解决办法

1、order by 索引(where条件中引用的索引)。

2、强制使用主键:FORCE INDEX(PRI),如果想强制使用索引,则用FORCE INDEX(索引名)。

 explain select t.order_id from book_order t FORCE INDEX(idx_bo_order_book_local) ORDER BY t.order_id desc;

三、其他order by 索引失效的原因分析

1、MySQL每天一条简单语句只应用一个索引,所以order by的字段要在索引之中,并且和where条件可以合并成组合索引。

2、select的字段,必须是索引字段。(主键查询除外)

3、如果sql语句为复合语句,包含子查询等,可以把语句分解成简单查询来分析。

最新文章

  1. 解决Chrome flash过期
  2. JavaScript的学习5
  3. NOI2018准备 Day11
  4. django_restframework_angularjs
  5. Python从内存中使用编译后的模块
  6. MONO 使用重要提示
  7. access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")
  8. Swift - Property ''not initialized at super.init call
  9. js中实现页面跳转
  10. DX9三角形顶点绕序的判断
  11. nmap -- write a nmap script
  12. 20_学生选课数据库SQL语句练习题
  13. 四则运算GUI
  14. 使用maven将项目打成jar包
  15. mariadb 内存占用优化
  16. @jsonProperty 实现返回自定义属性名字
  17. IBatisNet动态update以及DateTime类型字段处理
  18. .NetCore中EFCore for MySql整理(二)
  19. tomcat源码阅读之过滤器
  20. 为什么说Java中只有值传递----说服自己

热门文章

  1. React中的Context——从父组件传递数据
  2. scala函数等号省略
  3. 使用rclone 进行minio 文件同步
  4. JavaScript 中 this的指向
  5. 谈谈在 .Net 平台上的 软件生态 和 软件生产力
  6. DES加密Java实现
  7. dockerfile创建php容器(安装memcached、redis、gd、xdebug扩展)
  8. Java变量的初始值
  9. 自然语言处理工具HanLP被收录中国大数据产业发展的创新技术新书《数据之翼》
  10. Qt中的标准对话框之QMessageBox