我在表interim_19上执行67.500行的sql请求。表没有索引,有7列,其中不包含唯一/主键,因为主数据Abonent和idBase是重复的,在我拥有的所有数据中,有7-8个不同的idBases和~10.000个不同的Abonents,而像date这样的其他数据在唯一性方面不可靠。
这个问题是在这个表的内部连接缓慢。
如果我执行SELECT * FROM interim_19 WHERE idBase IN (1551 , 42286 ),它将花费1.33秒,而SELECT * FROM interim_19 WHERE idBase IN (1535 , 5406 )将花费1.9秒,无论是
SELECT * FROM (SELECT * FROM interim_19 WHERE idBase IN (1551 , 42286 ))
temp1
inner join
(SELECT * FROM interim_19 WHERE idBase IN (1535 , 5406 )) temp2
on temp1.Abonent = temp2.Abonent永远- 147-157秒。我知道,内部联接确实会将每一行与第二表中的每一行进行比较,但这不应该花这么长时间。它可以复制,但我需要所有的7+7行,所以.
我已经在尝试索引了,所以也欢迎其他建议。
发布于 2017-09-29 01:14:22
添加“复合”INDEX(idBase, Abonent)
(正如其他人所指出的,使用JOIN而不是子查询。)
INDEX不需要是“唯一的”。
147秒是因为子查询多次执行,每次查看67K行。我认为我的索引,上面,将帮助所有的查询,到目前为止。
发布于 2017-09-28 07:14:56
尝试删除那些不必要的子查询:
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列上添加一个索引。正如注释中所建议的,您也可以尝试缩小选择列表。
发布于 2017-09-28 07:21:41
子查询没有索引。尽量避免,只要有可能:
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)会比蒂姆的回答快一点..。
https://stackoverflow.com/questions/46462931
复制相似问题