mysql查询性能杀手:order by rand()

早上惯例查看access log的时候发现,有大量超过10s的慢请求,top看系统状态,mysqld 时不时跑到cpu 99%,登陆mysql,执行show processlist查看,有大量如下的command

converting HEAP to MyISAM
Copying to tmp table on disk

这都是拜 order by rand所赐,mysql对随机查询处理能力很差,遇到order by rand,就要全表扫描,创建临时表等,性能非常垃圾

处理这个问题有2种解决方法

  1. 分析sql需求,减少 执行 随机查询的地方,页面上写随机文章,数据并一定非要用随机查出

  2. 实在砍不掉的随机查询,综合 IO,cpu性能,下面是最佳方法

select * from table_name where `id` in (1,3,5,6) order by field(`id`,5,3,6,1)

关键就是这个order by field( id ,...)`特性了

id list 在python中可以很简单的获取,首先select min(id) as i,max(id) as x from table_name,然后利用这个结果得到执行 random.sample(range(i,x),number+10) 就可以得到一个随机id列表了

+10的原因:表中记录的id不一定是连续的,sample出来的id可能查不到结果,多取点说不定刚刚好,如果超过,slice一下即可

本文地址: http://lutaf.com/63.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接