兰德()的表现

时间:2011-03-30 03:52:19

标签: performance random

我听说我应该避免使用'by by rand()',但我确实需要使用它。与我听到的不同,以下查询非常快。

select 

    cp1.img_id as left_id,
    cp1.img_filename as left_filename,
    cp1.facebook_name as left_facebook_name,
    cp2.img_id as right_id, 
    cp2.img_filename as right_filename,
    cp2.facebook_name as right_facebook_name    

from 
challenge_photos as cp1
cross join 
challenge_photos as cp2
where
(cp1.img_id < cp2.img_id) 
and 
(cp1.img_id,cp2.img_id) not in ((0,0)) 
and 
(cp1.img_status = 1 and cp2.img_status = 1) 
order by rand() limit 1

这个查询被认为是'好吗'?或者我应该通过搜索“alt to rand()”来查找我能找到的查询?

1 个答案:

答案 0 :(得分:2)

这通常是表演的事情。您应该尽可能地避免每行功能,因为它们会减慢您的查询速度。

这意味着uppercase(name)salary * 1.1之类的内容。它还包括rand()。它可能不是一个直接的问题(10,000行),但是,如果你想要扩展数据库,你应该记住它。

两个主要问题是您正在执行每行功能,然后在选择第一行之前必须对输出执行完整排序。如果您对随机值进行排序,则DBMS无法使用索引。

但是,如果你需要这样做(而且我没有在那里进行判断调用),那么你需要这样做。实用主义经常克服现实世界中的教条主义: - )


如果性能成为一个问题,那么有可能用以下内容来计算记录:

select count(*) from ...

然后在客户端选择一个随机值并使用:

limit <start>, <count>
另一个select中的

子句,调整特定DBMS使用的语法。这应该可以消除排序问题以及通过线路传输不需要的数据。