【发布时间】:2014-08-29 04:50:28
【问题描述】:
我正在尝试对一个相当简单(但很大)的表执行选择查询,当我不加入某个辅助表时,性能会降低 10 倍以上。
TableA 以“ID1”和“ID2”两列为键,共有 10 个数字 (int + dbl) 列。
TableB 以“ID1”为键,共有 2 个数字 (int) 列。
SELECT
AVG(NULLIF(dollarValue, 0))
FROM
TableA
INNER JOIN
TableB
ON
TableA.ID1 = TableB.ID1
WHERE
TableA.ID2 = 5
AND
TableA.ID1 BETWEEN 15000 AND 20000
一旦移除连接,性能就会受到重大影响。上面的查询需要 0.016 秒 才能运行,而下面的查询需要 0.216 秒 才能运行。
最终目标是用 TableB 的第二(非键)列替换 TableA 的“ID1”并弃用 TableB。
SELECT
AVG(NULLIF(dollarValue, 0))
FROM
tableA
WHERE
ID2 = 5
AND
ID1 BETWEEN 15000 AND 20000
两个表的主键都有索引。两个表之间的关系是一对多的。数据库引擎是 MyISAM。
场景 1(快速):
id stype table type possKey key kln ref rws extra
1 SIMPLE TableB range PRIMARY PRIMARY 4 498 Using where; Using index
1 SIMPLE TableA eq_ref PRIMARY PRIMARY 8 schm.TableA.ID1,const 1
场景 2(慢):
id stype table type possKey key key_len ref rows extra
1 SIMPLE TableA range PRIMARY PRIMARY 8 288282 Using where
场景 2 中的行数和没有提及索引的情况确实很突出,但为什么会这样呢?
两个查询的 700 个结果 -- 相同的数据。
【问题讨论】:
-
第一个查询有多少结果,第二个查询有多少结果?
-
为这两个查询提供
EXPLAIN。
标签: mysql sql performance select join