已知,shop_orders 已设置ctime为索引,且为时间戳储存,格式int 长度11.
如果使用ctime或者使用主键id做排序,查询速度40秒+,去掉3毫秒!
SELECT `a`.`id`,
`a`.`ctime`,
`a`.`status`,
`a`.`order_id`,
`a`.`total`,
`c`.`s_name`
FROM `shop_orders` a
INNER JOIN(SELECT * FROM `shop_config` WHERE `store_id`= 1) `c` ON `a`.`shop_id`= `c`.`id`
ORDER BY `a`.`ctime` DESC
LIMIT 0,30
我说一下我的排查过程。
1、先把ctime字段添加到索引。
2、加explain查询可知,因为我是join连表,当前语句没有索引。
因此我们加上强制索引force index(`ctime`)即可解决。
最终代码
SELECT `a`.`id`,
`a`.`ctime`,
`a`.`status`,
`a`.`order_id`,
`a`.`total`,
`c`.`s_name`
FROM `shop_orders` a force index(`ctime`)
INNER JOIN(SELECT * FROM `shop_config` WHERE `store_id`= 1) `c` ON `a`.`shop_id`= `c`.`id`
ORDER BY `a`.`ctime` DESC
LIMIT 0,30
如果你需要做时间范围筛选,用时间戳大小的方式,不要使用FROM_UNIXTIME或者TO_DAYS( NOW( ) ),否则速度又回去了。知道是什么原因的老哥可在评论区指点一下。
'a.ctime >'.strtotime(date('Y-m-d',time()))