不加入时会影响SQL性能

时间:2014-08-29 04:50:28

标签: mysql sql performance select join

我正在尝试在一个相当简单(但很大)的表上执行选择查询,并且当我加入某个辅助表时,性能会降低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个查询的结果 - 相同的数据。

1 个答案:

答案 0 :(得分:1)

鉴于您的查询,我说这样的索引可能有用:

CREATE INDEX i ON tableA(ID2, ID1)

第一个查询速度更快的一个可能原因是因为tableB中可能只有少量记录,这使得连接谓词与范围谓词相比非常具有选择性。< / p>

I suggest reading up on indexes。了解2-3个有关它们的详细信息将帮助您仅通过选择更好的索引来轻松调整查询。