慢速SQL INNER JOIN

时间:2017-09-28 07:05:56

标签: mysql join indexing

我在表interim_19上以67.500行执行sql请求。表没有编入索引,并且有7列,其中没有唯一/主键,因为主数据AbonentidBase正在重复,所有数据中我都喜欢7-8个不同{{1} }和~10,000个不同的idBases,其他数据如Abonents在唯一性方面不可靠。

问题在于此表中缓慢的内部联接。

如果我执行date它将需要1.33秒,SELECT * FROM interim_19 WHERE idBase IN (1551 , 42286 )将需要1.9秒,无论

SELECT * FROM interim_19 WHERE idBase IN (1535 , 5406 )

需要永远 - 147-157秒。我知道内连接确实比较了第二个表上的每一行到每一行,但这不应该花这么长时间。 OFC它会重复,但我需要所有7 + 7行,所以......

P.S我已经尝试将其编入索引,因此也欢迎其他建议。

3 个答案:

答案 0 :(得分:2)

尝试删除那些不必要的子查询:

SELECT *
FROM interim_19 t1
INNER JOIN interim_19 t2
    ON t1.Abonent = t2.Abonent
WHERE
    t1.idBase IN (1551 , 4228) AND
    t2.idBase IN (1535 , 5406)

除此之外,您可以考虑在idBase列上添加索引。正如评论中所建议的那样,您也可以尝试缩小选择列表的范围。

答案 1 :(得分:2)

子查询没有索引。尽可能避免使用它们:

SELECT *
FROM interim_19 t1
INNER JOIN interim_19 t2
    ON (t1.Abonent = t2.Abonent AND t2.idBase IN (1535 , 5406))
WHERE
    t1.idBase IN (1551 , 4228)

比蒂姆的答案要快一点......

答案 2 :(得分:2)

添加'复合材料' INDEX(idBase, Abonent)

(并且,正如其他人指出的那样,使用JOIN,而不是子查询。)

INDEX不需要"唯一"。

147秒是因为子查询执行多次次,每次查看67K行。我认为我上面的索引将帮助到目前为止提到的所有查询。