当前位置:  数据库>数据库 iis7站长之家

order by多个字段对索引的影响

    来源: 互联网  发布时间:2017-06-02

    本文导语: 某前台sql语句,简化后如下SELECT products_name,products_viewed FROM `products_description` ORDER BY products_viewed DESC,products_name LIMIT 0,20; 该语句经常大批量出现在慢日志中! 初步看改语句,非常简单,根据products_viewed(产品被查看次数)倒序排序...

某前台sql语句,简化后如下
SELECT products_name,products_viewed FROM `products_description`
ORDER BY products_viewed DESC,products_name LIMIT 0,20;

该语句经常大批量出现在慢日志中!

初步看改语句,非常简单,根据products_viewed(产品被查看次数)倒序排序,再根据products_name(产品名字)排序!在products_viewed和products_name上分别建立有索引!
但是感觉products_name排序怪怪的!
explain后发现
+----+-------------+----------------------+------+---------------+------+---------+------+-------+----------------+
| id | select_type | table                | type | possible_keys | key  | key_len | ref  | rows  | Extra          |
+----+-------------+----------------------+------+---------------+------+---------+------+-------+----------------+
|  1 | SIMPLE      | products_description | ALL  | NULL          | NULL | NULL    | NULL | 764370 | Using filesort |
+----+-------------+----------------------+------+---------------+------+---------+------+-------+----------------+

改语句做竟然全表扫描!

mysql的order by语句,如果在where条件中没有合适的索引选择时,将会选择order by col中的索引作为条件,但是如果是多个order by组合,将会导致放弃使用索引!
和开发以及需求沟通,发现通过名字排序是可以不需要的!
我们去掉order by后面的 products_name!
再次explain后发现已经能够使用索引:
explain SELECT products_name,products_viewed FROM `products_description`
 ORDER BY products_viewed LIMIT 0,20;
+----+-------------+----------------------+-------+---------------+-----------------+---------+------+------+-------+
| id | select_type | table                | type  | possible_keys | key            | key_len | ref  | rows | Extra |
+----+-------------+----------------------+-------+---------------+-----------------+---------+------+------+-------+
|  1 | SIMPLE      | products_description | index | NULL          | products_viewed | 5      | NULL |  20 |      |
+----+-------------+----------------------+-------+---------------+-----------------+---------+------+------+-------+

再次对比两次profiling(过程省略),发现第一次损坏大量io和cpu时间Sorting result上!因为该语句为前台语句,有大量查询,优化后,页面打开速度明显提升!

注意:
1. order by m,n  不要轻易写这种语句,一般的order by前面的m才是order by的重点,后面的n为配角,如果没有必要,尽量去掉
2. 参考我的另一篇


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.nio类charbuffer的类成员方法: order定义及介绍
  • 关于java中执行sql语句使用order by的问题!
  • java命名空间java.nio类bytebuffer的类成员方法: order定义及介绍
  • mysql中order by与group by的区别
  • java命名空间javax.naming.directory类basicattribute的类成员方法: ordered定义及介绍
  • 深入解析mysql中order by与group by的顺序问题
  • java命名空间java.nio类intbuffer的类成员方法: order定义及介绍
  • ThinkPHP CURD方法之order方法详解
  • java命名空间java.nio类doublebuffer的类成员方法: order定义及介绍
  • 如何在CMP中处理Order by 和 Group by
  • java命名空间java.nio类shortbuffer的类成员方法: order定义及介绍
  • 在sql中不指定Order by排序是按照主键吗
  • java命名空间java.nio类longbuffer的类成员方法: order定义及介绍
  • String sqlstr="select max(RECN) as recn from order_info";
  • java命名空间java.nio类floatbuffer的类成员方法: order定义及介绍
  • MySQL Order By用法分享
  • java命名空间javax.swing.event枚举rowsorterevent.type的类成员方法: sort_order_changed定义及介绍
  • mysql order by 失效了?
  • java命名空间java.util.jar接口pack200.packer的类成员方法: keep_file_order定义及介绍
  • oracle使用order by排序null值如何处理
  • java命名空间java.lang类string的类成员方法: case_insensitive_order定义及介绍
  • union组合结果集时的order问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,