日期:2014-05-17  浏览次数:20605 次

这条语句可以优化吗?量大的话很慢。。

SELECT prr.*,r.r_icon,r.r_desc,r.r_name,r.r_uri,r.r_thumbnail FROM `points_resource_relation` prr 
INNER JOIN resource r ON prr.r_id=r.r_id
WHERE  1=1   AND r.r_gender=1 ORDER BY RAND() LIMIT 1

从一条查询语句中随机选出一条数据,所以用了ORDER BY RAND() ,但是量大(10万)的话查询就很慢。大概1秒以上了。这个速度不能接受啊。。。

有没有办法优化或者换一种语句让他查询更快呢?

------解决方案--------------------
--因为要随机排序后,再取一条。所以10W记录每次都会随机排序,性能主要消耗在这儿
--变通一下。比如每条记录都有一主键。用随机算法算出主键的值(范围即可),再随机取一条
select top(1) from tb where id between @begin and @end. --先随机得到@begin和@end
------解决方案--------------------
select top(1) from tb where id between @begin and @end order by newid()
------解决方案--------------------
r_gender,r_id 这两个列做个组合的非聚集索引试试
------解决方案--------------------
Limit 1 典型的MYSQL语法
ORDER By RAND()随机取一条要改变方式,否则性能总是问题
------解决方案--------------------
避免用select * ... ,应把需要返回的字段列出来为好.