我在表interim_19
上以67.500行执行sql请求。表没有编入索引,并且有7列,其中没有唯一/主键,因为主数据Abonent
和idBase
正在重复,所有数据中我都喜欢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我已经尝试将其编入索引,因此也欢迎其他建议。
答案 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行。我认为我上面的索引将帮助到目前为止提到的所有查询。