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