帮我优化随机记录的查询

时间:2011-08-31 18:49:24

标签: mysql sql

我目前对随机记录的查询非常低效,因为它是由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

你会怎么做?

1 个答案:

答案 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,请原谅我;不完全确定它是否会起作用。