我听说我应该避免使用'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()”来查找我能找到的查询?
答案 0 :(得分:2)
这通常是表演的事情。您应该尽可能地避免每行功能,因为它们会减慢您的查询速度。
这意味着uppercase(name)
,salary * 1.1
之类的内容。它还包括rand()
。它可能不是一个直接的问题(10,000行),但是,如果你想要扩展数据库,你应该记住它。
两个主要问题是您正在执行每行功能,然后在选择第一行之前必须对输出执行完整排序。如果您对随机值进行排序,则DBMS无法使用索引。
但是,如果你需要这样做(而且我没有在那里进行判断调用),那么你需要这样做。实用主义经常克服现实世界中的教条主义: - )
如果性能成为一个问题,那么有可能用以下内容来计算记录:
select count(*) from ...
然后在客户端选择一个随机值并使用:
limit <start>, <count>
另一个select中的子句,调整特定DBMS使用的语法。这应该可以消除排序问题以及通过线路传输不需要的数据。