我正在尝试在一个相当简单(但很大)的表上执行选择查询,并且当我不加入某个辅助表时,性能会降低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个查询的结果 - 相同的数据。
答案 0 :(得分:1)
鉴于您的查询,我说这样的索引可能有用:
CREATE INDEX i ON tableA(ID2, ID1)
第一个查询速度更快的一个可能原因是因为tableB
中可能只有少量记录,这使得连接谓词与范围谓词相比非常具有选择性。< / p>
I suggest reading up on indexes。了解2-3个有关它们的详细信息将帮助您仅通过选择更好的索引来轻松调整查询。