本问题已经有最佳答案,请猛点这里访问。
我必须在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
看到这篇文章explaitextended.com/2009/03/01/selecting-random-rows
您是否在"冷"服务器上计时不带ORDER BY的查询? 0.0009秒听起来像是从缓存中获取结果。
看到这个链接:
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列表中可能存在间隙。请参阅文章以获取更多高级示例
我去解决。
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快速从60万行中选择10条随机行
这是解决方案。
谢谢
这非常慢,因为您要为表中的每一行分配一个随机值,然后对整个表进行排序,然后将其中的大部分丢弃。您会变得更好:
检索所有帖子ID;
在php中随机选择25个;
在数据库中查询那些行。
这将以线性时间运行;现在是O(n log n)。
这是迄今为止我所见过的最好的解决方案,它可以实现ID的不均匀分配。如果您的ID是连续的(换句话说,如果您永远不会删除任何行),则可以更快地执行此操作。
rand()有一些性能"问题"-这里讨论了一些建议:如何优化MySQLs ORDER BY RAND()函数?