快捷搜索: 王者荣耀 脱发

mysql中使用order by 速度很慢解决办法

背景: 今天在优化项目中的一条查询语句,耗时5秒左右,大概6张表关联查询,然后结果进行排序之后再分页查询20条数据。

代码:

SELECT
	*
FROM
	t_card_recharge 
	LEFT JOIN s_admin ON t_card_recharge.create_user = s_admin.id
	LEFT JOIN t_quota ON t_card_recharge.quota_id = t_quota.id
	LEFT JOIN b_user ON b_user.id = t_quota.user_id
	LEFT JOIN s_area ON t_card_recharge.area_id = s_area.id
	LEFT JOIN wx_refund ON t_card_recharge.order_id = wx_refund.id 
WHERE
	t_card_recharge.area_id LIKE CONCAT( 659007, % ) 
	AND t_card_recharge.create_time >= concat( 2022-01-01,  00:00:00 ) 
AND t_card_recharge.create_time <= concat( 2022-09-21,  23:59:59 ) 
ORDER BY
	t_card_recharge.create_time DESC 
	LIMIT 0,
	20

不分页满足where条件一共3W多条数据,加上order by的时候速度非常慢,去掉速度反而很快。

找原因过程:

使用explain进行查看sql执行情况如下:

可以看到Extra一栏里面的Using temporary; Using filesort,使用了临时表和filesort排序,当查询数量过多,或者排序没有正确使用索引都会出现Using temporary,导致大量的IO操作严重影响查询性能。

解决办法:

优化查询语句,使用FORCE INDEX强制使用索引。

select 
    *
FROM
	t_card_recharge FORCE INDEX(idx_create_time)

查询时间变成变成了0.6秒。

PS:当mysql不能使用索引进行排序时候会使用自己的排序规则filesort进行排序。

经验分享 程序员 微信小程序 职场和发展