2011-03-26 148 views
0

我试图准备一个性能查询。我希望从下面的查询中删除RAND(),并将其替换为更好的替代方案。有人有任何建议吗?RAND()查询和性能

SELECT video.*, 
     video.wins/video.loses AS win_loss_ratio 
    FROM video 
WHERE video.videoid NOT IN (SELECT vidlog.videoid 
           FROM video AS vid, 
            video_log AS vidlog 
           WHERE vid.videoid = vidlog.videoid) 
    AND video.round = 0 
ORDER BY RAND(), win_loss_ratio DESC 
LIMIT 0, 2 

谢谢!

+0

的可能重复[MySQL的:替代ORDER BY RAND()](http://stackoverflow.com/questions/1823306/ mysql-alternatives-by-rand) – 2011-03-26 20:25:04

+0

感谢您指出此链接。我在帖子前做了一些搜索;不过,我对整个查询感兴趣。 – 2011-03-26 22:31:57

回答

1

而不是使用RAND()在调用此查询语言的LIMIT的偏移量中使用一个随机数。尽管a可能有两个问题。你需要知道数据库中有多少物品,2.只能为其中一个物品随机产生一些东西。其他选项是完全删除LIMIT和RAND(),只是在查询返回时选择随机项目(我想这会更慢)

是否有一个真正的原因,为什么你需要这个非常高性能?我很确定使用RAND()对于这种查询足够了。

+1

ORDER BY RAND()的性能取决于正在处理的记录数。 – 2011-03-26 20:34:44

+0

在选择两条随机记录之前,我已经返回记录的计数。我可以用它作为基础。 – 2011-03-26 22:30:44

0

而不是in子查询,尝试一个独占的左连接?这样,MySQL的知道它不必扫描video表两次:

SELECT video.* 
,  video.wins/video.loses AS win_loss_ratio 
FROM video 
LEFT JOIN  
     video_log as vidlog 
ON  vid.videoid = vidlog.videoid 
WHERE vidlog.videoid is null 
     AND video.round =0 
ORDER BY 
     RAND() 
LIMIT 0 , 2 
+0

取决于'VIDEO_LOG.videoid'是否可以是NULL - 如果可以,'NOT EXISTS'是更好的选择。否则,'LEFT JOIN/IS NULL'是最好的选择(看起来像一个外键,所以这可能是最好的选择)。但是这并没有解决使用'ORDER BY RAND()'的性能问题,该问题始于100 + K记录。 – 2011-03-26 20:33:25

+0

video_log在某些场合将为空。什么样的表现问题将开始时,我打100k记录? – 2011-03-26 22:29:50