我必须在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
答案 0 :(得分:1)
我去解决方案。
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
这是解决方案。
由于
答案 1 :(得分:1)
看到这个链接: 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列表中可能存在间隙。有关更多高级示例,请参阅文章
答案 2 :(得分:0)
rand()有一些表现"问题" - 这里讨论了一些建议:How can i optimize MySQL's ORDER BY RAND() function?
答案 3 :(得分:0)
这非常慢,因为你为表中的每一行分配一个随机值,然后对整个表进行排序,然后将大部分表扔掉。你会好多了:
这将以线性时间运行;目前它是O(n log n)
。
这是迄今为止我见过的最佳解决方案,它允许ID的分布不均匀。如果你的ID是连续的,你可以更快地完成它(换句话说,如果你永远不会删除任何行)。