【发布时间】:2011-10-31 22:48:37
【问题描述】:
所以我有这个相对简单的查询,可以根据两个不同的 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() 行显然在大型表上运行非常缓慢。
我已经看到了这个问题的一些潜在解决方案,但它们非常神秘,我无法理解与上面的查询相关的任何一个。
我真的很惊讶 MySQL 没有内置的解决方案来解决这个非常慢的ORDER BY RAND() 问题,因为在我看来,对于需要选择随机行的许多类型的应用程序来说,这是一个非常基本的需求.
那么如何优化我上面的查询,以便在不长执行时间的情况下获得相同/相似的效果?
【问题讨论】: