2011-08-31 81 views
1

我目前有一个查询的随机记录是疯了效率低下,因为它是由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

那么如何缓存随机记录? – NullUserException

+0

这是如何创建临时表? – Raider

+0

随机选择不能完全缓存,但是,上述语句将选择所有10,000个列表,然后随机排序,然后将其限制为4条记录。效率极低。 – Tron

回答

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 

基本上是我的建议,以加快东西是转储按顺序排列。任何超过几条记录都会增加可测量的开销。

ps请原谅,如果concat不能在mqsql中以这种方式使用;并不完全确定它是否会起作用。

+0

更好地在ID上使用整数'RAND()? – Gustav

+0

@Gustav,不知道! Rand()给出一个0到1之间的数字;我只是给这个随机数字做任何事情的机会。这并不重要;只要你摆脱顺序。我试图强制执行主键的范围扫描(我假设)以及加快速度。 – Ben

+0

这是做到这一点的方法。我的意思只是如果ID是一个整数而不是varchar。 – Gustav