2

此查询需要 10 秒才能完成。但是当我手动执行子查询并将t1.id限制更改为该列表时,它会在 0.00 秒内完成。我该怎么做才能让 MySQL 更快地执行查询?

SELECT t1.col1, t2.col2, t3.col3
FROM t1, t2, t3
WHERE  t1.t2id = t2.id AND t1.t3id = t3.id
AND t1.id IN ( SELECT id FROM t4 WHERE blah = 123 )

另外,为什么会这样?我想 MySQL 在过滤 t1.id 之前以某种方式连接了所有三个表。

t1、t2 和 t3 分别包含 3000、15 和 80 行。子查询返回 2-10 行。

4

3 回答 3

2

尝试使用“INNER JOIN”而不是“IN”功能。这样您的 sql 指令将更具执行性。

SELECT t1.col1, t2.col2, t3.col3
FROM ((t1 INNER JOIN t2 ON t1.t2id = t2.id) INNER JOIN t3 ON t1.t3id = t3.id) INNER JOIN t4 ON t1.id = t4.id
WHERE t4.blah = 123
于 2012-08-17T11:53:07.723 回答
1

重写不带子查询的查询:

SELECT t1.col1, t2.col2, t3.col3
FROM t1, t2, t3, (SELECT id FROM t4 WHERE blah = 123) AS t4
WHERE  t1.t2id = t2.id AND t1.t3id = t3.id
AND t1.id=t4.id

确保您对子句中使用的字段有索引WHERE

于 2012-08-17T11:52:54.510 回答
1

如果您运行EXPLAIN您的语句,您可能会看到 MySql 在磁盘上创建了一个临时表:如果内联选择(您的IN术语)中的数据足够大,通常会发生这种情况。

简而言之:

a) 用于EXPLAIN查看数据库中发生了什么(并查看此行为如何随着数据的增加而变化)

b)如果可以的话,避免内联子查询

c) 请记住,MySql 只有一个嵌套循环连接算法可供使用(其他数据库也使用哈希连接和合并连接算法)所以你可能会看到较小的数据集进行“较少”解析,但是当你达到了一个临界点。

于 2012-08-17T12:04:53.123 回答