我目前有一个非常低效的随机记录查询,因为它按 RAND() 排序并在每次调用时创建一个临时表。此外,这意味着它不能被缓存。它还连接到另一个表,这增加了处理时间并使事情变得有点复杂。所以,请帮助我优化以下内容:
SELECT listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE listings.price > 100
AND sellers.blacklisted = 0
ORDER BY RAND()
LIMIT 4
开始解决此问题的一种方法是运行一个查询,该查询返回可能列表的 COUNT(),然后运行第二个查询(或 4 个其他查询,如果它是真正随机的)并在 RAND()* 内设置偏移量计数。
你会如何处理这个问题?
最佳答案
假设 listings
在 id 上建立索引:
如果您的 id 是整数:
SELECT listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE listings.price > 100
AND sellers.blacklisted = 0
AND listings.ID LIKE CONCAT(CEIL(RAND() * 100),'%')
LIMIT 4
如果是ascii
SELECT listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE listings.price > 100
AND sellers.blacklisted = 0
AND listings.ID LIKE CONCAT(CHAR(CEIL(RAND() * 100)),'%')
LIMIT 4
基本上,我的加快速度的建议是转储订单。在任何超过几条记录的情况下,您都会增加可衡量的开销。
ps如果concat不能在mqsql中这样使用请见谅;不完全确定它是否会起作用。
关于mysql - 帮我优化随机记录的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7261908/