今天一个用户反馈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
相关推荐
Order by desc/asc limit M是我在mysql sql优化中经常遇到的一种场景,其优化原理也非常的简单,就是利用索引的有序性,优化器沿着索引的顺序扫描,在扫描到符合条件的M行数据后,停止扫描;看起来非常的简单,但是...
48.MySQL高级_为排序使用索引OrderBy优化.avi 47.MySQL高级_in和exists.avi 46.MySQL高级_小表驱动大表.avi 45.MySQL高级_索引优化答疑补充和总结口诀.avi 44.MySQL高级_索引面试题分析.avi 43.MySQL高级...
尚硅谷_MySQL高级_为排序使用索引OrderBy优化 · 49.尚硅谷_MySQL高级_慢查询日志 · 50.尚硅谷_MySQL高级_批量插入数据脚本 · 51.尚硅谷_MySQL高级_用Show Profile进行sql分析 · 52.尚硅谷_MySQL高级_全局...
通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询。例如下面这个SQL: SELECT * FROM `t1` WHERE ftype=1 ORDER BY id DESC LIMIT 100, 10; 或者像下面这个不带任何条件的分页SQL: SELECT * ...
SQL优化:插入数据、主键优化、order by优化、group by优化、limit优化、count优化、update优化 视图:基本语法、检查选项、更新及作用 存储过程:基本语法、变量、判断、参数、case、循环、游标、条件处理程序 ...
2.2020-开年标杆班-day05-MySQL-select having order by limit 3.2020-开年标杆班-day05-MySQL-select 多表连接查询介绍 4.2020-开年标杆班-day05-MySQL-select 多表连接查询例子讲解 5.2020-开年标杆班-day...
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. 其它...
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. ...
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也不例外。用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何利用...
众所周知,在MySQL中,如果直接 ORDER BY RAND() 的话,效率非常差,因为会多次执行。事实上,如果等值查询也是用 RAND() 的话也如此,我们先来看看下面这几个SQL的不同执行计划和执行耗时。 首先,看下建表DDL,这...
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. ...
查询游戏历史成绩最高分前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,
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也不例外。用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何...
排序是数据库中的一个基本功能,MySQL也不例外。用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何利用...