我目前对随机记录的查询非常低效,因为它是由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()内设置偏移量* COUNT
你会怎么做?
答案 0 :(得分:1)
假设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
基本上我加快速度的建议就是抛弃订单。在几条记录上,你增加了可测量的开销。
如果在mqsql中不能以这种方式使用concat,请原谅我;不完全确定它是否会起作用。