`

一个MySQL order by优化案例

 
阅读更多

 

今天一个用户反馈SQL执行比较慢记录下分析过程:

 1.用户的SQL 

    SELECT * FROM ie_article_25 WHERE status = 3  AND addtime < 1284078469 order by addtime desc LIMIT 0, 1 \G

 

 2. 查看执行计划

   mysql> explain SELECT * FROM ie_article_25    WHERE status = 3  AND addtime < 1284078469  LIMIT 0, 1 \G

   *************************** 1. row ***************************

           id: 1

     select_type: SIMPLE

         table: ie_article_25

         type: ref

   possible_keys: addtime,IDX_STATUS_ADDTIME,IDX_Status,IDX_STATUS_CATID

          key: IDX_STATUS_ADDTIME

       key_len: 1

          ref: const

         rows: 7980

        Extra: Using index condition

  发现走了索引IDX_STATUS_ADDTIME,走了这个索引应该可以过滤掉数据同时可以避免排序了,按理说不应该有性能问题了。

 

  3.测试

  手动执行了一下"SELECT * FROM ie_article_25 WHERE status = 3  AND addtime < 1284078469 order by addtime desc LIMIT 0, 1"  执行时间为1.5s

然后又执行了下"SELECT * FROM ie_article_25  force index(addtime)  WHERE status = 3  AND addtime < 1284078469 order by addtime desc  LIMIT 0, 1 \G" 

时间竟然为0.04s。到这里猜测IDX_STATUS_ADDTIME只走了status索引,其实通过执行计划还是可以看出来的key_len: 1这个是因为status的定义为tinyint(1)。

 

  4.猜测

  其实还是不能理解为何没有使用addtime字段,这里where使用的是小于号,而且order by是desc只能猜测是否是索引信息没有更新的问题。

执行analyse table ie_article_25;更新表信息。

 

 再重新执行explain 原来的SQL发现执行计划果然变了,现在采用的是addtime索引了,执行的速度顺便变成了0.04s

*************************** 1. row ***************************

           id: 1

     select_type: SIMPLE

         table: ie_article_25

         type: range

   possible_keys: addtime,IDX_STATUS_ADDTIME,IDX_Status,IDX_STATUS_CATID

          key: addtime

       key_len: 4

          ref: NULL

         rows: 275648

        Extra: Using index condition; Using where

1 row in set (0.04 sec)

 

  5.结论

  这个执行计划还可以更优一点,走这个IDX_STATUS_ADDTIME索引,用force index(IDX_STATUS_ADDTIME)发现执行时间变了0.03s了。

 SELECT * FROM ie_article_25 force index(IDX_STATUS_ADDTIME)   WHERE status = 3  AND addtime < 1284078469  order by addtime desc LIMIT 0, 1

 

用户的部分表结构:

CREATE TABLE `ie_article_25` (

  `itemid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `addtime` int(10) unsigned NOT NULL DEFAULT '0',

  `status` tinyint(1) NOT NULL DEFAULT '0',

  PRIMARY KEY (`itemid`),

  KEY `addtime` (`addtime`),

  KEY `IDX_STATUS_ADDTIME` (`status`,`addtime`),

  KEY `IDX_CA_ST_AD` (`catid`,`status`,`addtime`),

  KEY `IDX_Status` (`status`),

  KEY `IDX_STATUS_CATID` (`status`,`catid`),

) ENGINE=MyISAM

 

分享到:
评论

相关推荐

    MySQL索引优化的实际案例分析

    Order by desc/asc limit M是我在mysql sql优化中经常遇到的一种场景,其优化原理也非常的简单,就是利用索引的有序性,优化器沿着索引的顺序扫描,在扫描到符合条件的M行数据后,停止扫描;看起来非常的简单,但是...

    mysql高级视频教程百度云(2019).txt

    48.MySQL高级_为排序使用索引OrderBy优化.avi 47.MySQL高级_in和exists.avi 46.MySQL高级_小表驱动大表.avi 45.MySQL高级_索引优化答疑补充和总结口诀.avi 44.MySQL高级_索引面试题分析.avi 43.MySQL高级...

    尚硅谷Java视频教程_MySQL高级视频

    尚硅谷_MySQL高级_为排序使用索引OrderBy优化 · 49.尚硅谷_MySQL高级_慢查询日志 · 50.尚硅谷_MySQL高级_批量插入数据脚本 · 51.尚硅谷_MySQL高级_用Show Profile进行sql分析 · 52.尚硅谷_MySQL高级_全局...

    MySQL优化案例系列-mysql分页优化

    通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询。例如下面这个SQL: SELECT * FROM `t1` WHERE ftype=1 ORDER BY id DESC LIMIT 100, 10; 或者像下面这个不带任何条件的分页SQL: SELECT * ...

    Mysql 进阶修行学习

    SQL优化:插入数据、主键优化、order by优化、group by优化、limit优化、count优化、update优化 视图:基本语法、检查选项、更新及作用 存储过程:基本语法、变量、判断、参数、case、循环、游标、条件处理程序 ...

    最新老男孩Mysql标杆班day05.rar

    2.2020-开年标杆班-day05-MySQL-select having order by limit 3.2020-开年标杆班-day05-MySQL-select 多表连接查询介绍 4.2020-开年标杆班-day05-MySQL-select 多表连接查询例子讲解 5.2020-开年标杆班-day...

    MySQL 5.1参考手册

    7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. 其它...

    MySQL 5.1参考手册中文版

    7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. ...

    MySQL 5.1参考手册 (中文版)

    7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. 其它...

    浅谈MySQL排序原理与案例分析

    排序是数据库中的一个基本功能,MySQL也不例外。用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何利用...

    MySQL下的RAND()优化案例分析

    众所周知,在MySQL中,如果直接 ORDER BY RAND() 的话,效率非常差,因为会多次执行。事实上,如果等值查询也是用 RAND() 的话也如此,我们先来看看下面这几个SQL的不同执行计划和执行耗时。 首先,看下建表DDL,这...

    MYSQL中文手册

    7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. ...

    MYSQL子查询和嵌套查询优化实例解析

    查询游戏历史成绩最高分前100 Sql代码 SELECT ps.* FROM cdb_playsgame ps WHERE ps.credits=...GROUP BY ps.uid order by ps.credits desc LIMIT 100; Sql代码 SELECT ps.* FROM cdb_playsgame ps,(select ps1.uid,

    mysql5.1中文手册

    MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 ...

    MySQL排序原理与案例分析

     排序是数据库中的一个基本功能,MySQL也不例外。用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何...

    MySQL排序原理和案例详析

    排序是数据库中的一个基本功能,MySQL也不例外。用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何利用...

Global site tag (gtag.js) - Google Analytics