开发者社区> 扬仔8888> 正文

mysql中order by 和limit一起使用不当会导致效率极慢的4种优化方法

简介: 今天从慢查询发现一条语句查询时间达6秒。结果只查出一条记录。 原语句如下 SELECT biz_order_id, buyer_id, buyer_nick, item_id, item_name, total_price, buy_amount, pay_status, STATUS, att.
+关注继续查看

今天从慢查询发现一条语句查询时间达6秒。结果只查出一条记录。

原语句如下

SELECT biz_order_id, buyer_id, buyer_nick, gmt_create, gmt_modified, attributeCc, seller_id
FROM trade.biz_order
WHERE shop_id=20484 AND STATUS=4 AND gmt_create >= '2017-10-30 16:34:42' AND order_type = 6
ORDER BY gmt_create DESC, biz_order_id DESC
LIMIT 0,100;
执行计划

shop_id都有索引可却走了时间gmt_create的索引,rows=861665
优化方法3种:
1:强制走shop_id索引
SELECT biz_order_id, buyer_id, buyer_nick, gmt_create, gmt_modified, attributeCc, seller_id
FROM trade.biz_order force index(idx_shop_id)
WHERE shop_id=20484 AND STATUS=4 AND gmt_create >= '2017-10-30 16:34:42' AND order_type = 6
ORDER BY gmt_create DESC, biz_order_id DESC
LIMIT 0,100;

2:用子查询:
select * from ( SELECT biz_order_id, buyer_id, buyer_nick, gmt_create, gmt_modified, attributeCc, seller_id
FROM trade.biz_order
WHERE shop_id=20484 AND STATUS=4 AND gmt_create >= '2017-10-30 16:34:42' AND order_type = 6
ORDER BY gmt_create DESC, biz_order_id DESC) t
LIMIT 0,100;执行计划如上一样
3:调换order by中的两个条件顺序
ORDER BY biz_order_id DESC ,gmt_create DESC limit 0,100;换成这样。我发现这样执行计划的rows=1.9万效果更好。
4:还有一种方法删除gmt_create列的索引,原理和方法3差不多。
总结:mysql中的order ,limit一起使用时的顺序是这样的和oracle不一样
order -->limit-->where条件
而常规一般是where-->order-->limit。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SqlServer性能检测和优化工具使用详细
工具概要         如果你的数据库应用系统中,存在有大量表,视图,索引,触发器,函数,存储过程,sql语句等等,又性能低下,而苦逼的你又要对其优化,那么你该怎么办?哥教你,首先你要知道问题出在哪里?如果想知道问题出在哪里,并且找到他,咱们可以借助本文中要讲述的性能检测工具--sql server profiler(处在sql安装文件--性能工具--sql server profiler)     如果知道啦问题出现在哪里,如果你又是绝世高手,当然可以直中要害,写段代码给处理解决掉,但是如果你不行,你做不到,那么也无所谓,可以借助哥的力量给你解决问题。
1023 0
MySQL查看当前使用的配置文件my.cnf的方法
MySQL查看当前使用的配置文件my.cnf的方法 MySQL实例在启动时,会先读取配置参数文件my.cnf。my.cnf一般会放在MySQL的安装目录中,用户也可以放在其他目录加载。
5752 0
Reflection.Emit的使用场景、工具包及示例总结
最近处理一个业务需要动态的生成一些业务模型和库,使用到了Emit的处理,相关的资料整理一下供参考。 Reflection.Emit目的 使用的场景: 应用中自定义一个自己的语言 运行中动态的创建类型、模块等,同时又需要提高效率(可以动态编译一次,然后就不用再处理了) 延迟绑定对象的使用,在和Office这类的软件时会用到 动态插件系统等 … System.
1063 0
Mybatis Generator的使用
在写代码过程中,常常要写一些简单的CURD操作,为了能够把时间用在业务逻辑上,看了Mybatis Generator生成工具,根据官网的文档,改成适合自己使用的生成器。 mybatis generator的配置文件 如下: <?xml version="1.
6762 0
mysql之innodb引擎使用方法
前言 闲来无事做不如MySQL。 一.简介:1.Linux下使用MySQL数据库时,为了支持事务操作需要用到InnoDB引擎,对于表中处理的插入,更新等操作失败时,回滚前面不应该完成的操作是必须的.
1171 0
MySQL 中 SQL 优化常用的 30 种方法
1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
1028 0
+关注
9
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载