ORDER BY RAND()函数在mysql中执行需要很长时间[重复]
Posted
技术标签:
【中文标题】ORDER BY RAND()函数在mysql中执行需要很长时间[重复]【英文标题】:ORDER BY RAND() function taking long time to execute in mysql [duplicate] 【发布时间】:2014-12-06 11:17:20 【问题描述】:我必须在mysql query
中使用 RAND 函数。如果我在 sql 查询中使用这个函数,那么这大约需要 0.7962 秒。但是,如果我不使用它,那么它可以在 0.0009 秒内正常工作。如何使用 RAND 函数使 sql 查询更快。
我的查询
SELECT
posts.ID,
posts.post_content,
posts.post_title,
posts.post_date,
posts.post_name
FROM posts
WHERE posts.post_type = 'post'
AND posts.post_status = 'publish'
ORDER BY RAND() LIMIT 0, 24
【问题讨论】:
看这篇文章explainextended.com/2009/03/01/selecting-random-rows 您是否在“冷”服务器上为没有ORDER BY
的查询计时? 0.0009 秒听起来像是从缓存中获取结果。
【参考方案1】:
rand() 有一些性能“问题” - 这里讨论了一些建议:How can i optimize MySQL's ORDER BY RAND() function?
【讨论】:
【参考方案2】:这非常慢,因为您要为表中的每一行分配一个随机值,然后对整个表进行排序,然后将大部分丢弃。你会过得更好:
-
检索所有帖子 ID;
在php中随机选择其中的25个;
在数据库中查询这些行。
这将在线性时间内运行;目前是O(n log n)
。
这是迄今为止我见过的允许不均匀分布 ID 的最佳解决方案。如果您的 ID 是连续的(换句话说,如果您永远不会删除任何行),您可以更快地完成此操作。
【讨论】:
【参考方案3】:我去解决。
SELECT p1.ID, p1.post_content, p1.post_title, p1.post_date, p1.post_name
FROM posts as p1 JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(ID)
FROM posts)) AS id)
AS p2
WHERE p1.ID >= p2.id
ORDER BY p1.ID ASC
LIMIT 0, 24
这比我的查询要快。
MySQL select 10 random rows from 600K rows fast
这是解决方案。
谢谢
【讨论】:
【参考方案4】:查看此链接: http://jan.kneschke.de/projects/mysql/order-by-rand/
对于大多数一般情况,您可以这样做:
SELECT name
FROM random AS r1 JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1
这假设 id 的分布是相等的,并且 id 列表中可能存在间隙。有关更多高级示例,请参阅文章
【讨论】:
以上是关于ORDER BY RAND()函数在mysql中执行需要很长时间[重复]的主要内容,如果未能解决你的问题,请参考以下文章
mysql order by rand() 性能问题及解决方案