如何使用ORDER BY RAND()优化此SQL查询

时间:2012-02-23 21:47:42

标签: mysql sql optimization query-optimization sql-order-by

我正在尝试优化此查询,因为它运行的数据库很大,主机说这个查询导致服务器上出现严重负载。我已经阅读了一些关于如何替换ORDER BY RAND()的其他答案,但我不太了解SQL以使这些特定查询的答案适应。有人可以帮忙吗? TIA

  SELECT COUNT( p.prod_id ) AS no_prod, s.*
    FROM product p, seller s
   WHERE s.admin_status = '1' 
     AND s.pay_status = '1' 
     AND s.sub_type != '' 
     AND p.seller_id = s.seller_id 
GROUP BY s.seller_id 
  HAVING COUNT( p.prod_id )>5 
ORDER BY RAND() 
   LIMIT 0, 4 

3 个答案:

答案 0 :(得分:0)

您可能最好添加一个非唯一索引,其中包括字段 seller.admin_status,seller.pay_status,seller.sub_type 。通过索引WHERE子句中引用的字段,您将获得最大的收益。

答案 1 :(得分:0)

基于http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/

SET @MAX_SELLER_ID = SELECT MAX(seller_id) FROM seller;


SELECT COUNT( p.prod_id ) AS no_prod,
       s.*

FROM (
  -- preselect a big bunch of random sellers
  SELECT DISTINCT *
  FROM seller
  WHERE seller.id IN (
    FLOOR( RAND() * @MAX_SELLER_ID )
   ,FLOOR( RAND() * @MAX_SELLER_ID )
   ,... -- repeat or generate list of random ids in your app
  )
) AS s
INNER JOIN product p

WHERE s.admin_status = '1' 
  AND s.pay_status = '1' 
  AND s.sub_type != '' 
  AND p.seller_id = s.seller_id 

GROUP BY s.seller_id 
HAVING COUNT( p.prod_id )>5 

ORDER BY RAND() 
LIMIT 0, 4;

答案 2 :(得分:0)

由于ORDER BY RAND(),SQL导致严重负载。您可以谷歌了解这是一个问题的原因,并建议修复如何以其他方式实现相同的效果。

在一些谷歌搜索之后我能找到的最好的解释来自bug report关于solaris系统上同样的问题:

  

ORDER BY RAND()使用filesort,行为速度不如ORDER BY some_key。   发生这种情况,因为当您使用ORDER BY RAND()时,如果您编写如下查询,则相同:   SELECT id, rand() FROM t1 ORDER BY RAND();这意味着将为表中的每一行创建rand()。