因此,我有一个相对简单的查询,根据两个不同的 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/