mysql - 帮我优化随机记录的查询

标签 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()* 内设置偏移量计数。

你会如何处理这个问题?

最佳答案

假设 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/

相关文章:

mysql - 如何最好地组合和优化这两个查询?

jquery - jqGrid - 未应用日期和时间格式

mysql - 如何在同一个表上组合两个查询以在 MySQL 中获得单个结果集

c# - 将两个关键字列表列与另一列匹配以进行匹配

php - 数据库结果是对象还是数组?

php - 如何显示有多少访问者访问我的网站(按日期排序)

php - 多个 MySQL DELETE 禁用电子邮件通知

php - MySql 数据库结构按顺序存储项目列表

mysql - SQL中GROUP BY的基本用法

mysql - 带有子查询计算的复杂查询