繁体   English   中英

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

[英]How can I optimize this SQL query with ORDER BY RAND()

我正在尝试优化此查询,因为它运行的数据库很大,主机说这个查询导致服务器上的严重负载。 我已经阅读了一些关于如何替换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 

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

基于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;

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

在一些谷歌搜索之后我能找到的最佳解释来自关于solaris系统上同一问题的错误报告

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM