mysql - 如何优化由于 ORDER BY RAND() 导致的缓慢 MySQL 查询?

标签 mysql database random

因此,我有一个相对简单的查询,根据两个不同的 MyISAM 表中的一些条件来提取随机行:

SELECT 
    table1 . * , table2 . * 
FROM 
    Table1 AS table1
LEFT JOIN 
    Table2 AS table2
USING (
    col1
)
WHERE 
    table1.col1 !=  '5324372'
AND 
    table1.col2 LIKE  'S'
AND (
    table1.col3 LIKE  'I'
    OR table1.col3 LIKE  'V-G'
)
AND (
    table2.col1 =  'A'
    OR table2.col2 =  'B'
)
ORDER BY RAND( ) 
LIMIT 1

...一开始工作正常,但随着我的数据库开始增长,现在需要几秒钟才能执行。

上面使用的所有列都已建立索引,因此这不是索引问题。

根据我的研究,这是由于 ORDER BY RAND()这条线在大 table 上显然运行得很慢。

我已经看到了这个问题的一些潜在解决方案,但它们非常神秘,我无法理解与我上面的查询相关的任何一个。

我实际上很惊讶 MySQL 没有内置的解决方案来解决这个非常慢的问题 ORDER BY RAND()问题,因为在我看来,对于需要选择随机行的许多类型的应用程序来说,这是一个非常基本的需求。

那么我如何优化上面的查询,以便在没有较长执行时间的情况下获得相同/相似的效果?

最佳答案

排序通常是 N*log(N) 操作。通常,查询规划器/生成器/优化器通过将其与索引或子查询自然产生的顺序相结合来尽可能避免排序。随机排序不能以任何方式“优化”。解决方案:不要这样做。

关于mysql - 如何优化由于 ORDER BY RAND() 导致的缓慢 MySQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7960714/

相关文章:

php - 根据另一个选择填充选择

javascript - 将随机数组项组合成句子

database - 模式之间的 ROWID 值

mysql - 限制结果而不是分组结果

php - 显示按日期排序的随机结果

c++ - 随机函数 C++ 的种子值

mysql - 在 SELECT 中重用别名

mysql - 我希望查询返回 7 天后注册的用户的 ID

php - 使用Where和Group By子句在Yii中的CDBCriteria中编写查询

sql - 奇怪的 OpenEdge 查询行为