2017-09-28 291 views
1

我上表interim_19执行SQL请求以67.500排。表不被编入索引,且具有7列,非其中是唯一的/主键,因为主数据AbonentidBase被重复,所有的数据中予有像7-8不同idBases和〜10.000不同Abonents,以及其他数据等date在唯一性方面不可靠。慢SQL INNER JOIN

的问题是在慢内部连接在这个表上。

如果我执行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秒。我知道内连接不会比较每一行到第二个表上的每一行,但是这不应该花这么长时间。 OFC它让重复的,但我需要的所有7个+ 7行,所以......

P.S我已经试图建立索引,以便其他建议也欢迎。

+0

我没有看到派生表的原因,并直接连接表。另外,只选择您实际需要的列。 “SELECT *”对你没有任何好处。 –

+0

它是mySql还是SQL Server?请编辑您的标签 –

回答

2

添加的“复合” INDEX(idBase, Abonent)

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

INDEX不需要是“唯一的”。

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

+0

谢谢你,两项增加索引从147秒改善到0.8。 – upicik

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列添加索引。正如评论中所建议的那样,您也可以尝试缩小您的选择列表。

+0

如果我得到了另一个idBase来比较,我怎么在这里补充另一个内部联接? – upicik

+0

如果您还有其他问题,那么您可能需要提出一个新问题,而不是更改当前问题。 –

+0

不,我的意思是,我想在此查询中添加另一个连接。应该是: 'SELECT * FROM interim_19 t1 INNER JOIN interim_19 t2 ON t1.Abonent = t2.Abonent INNER JOIN interim_19 t3 ON t3.Abonent = t2.Abonent WHERE t1.idBase IN(1551,4228)AND t2.idBase IN(1535,5406)AND t3.idBase IN(29551618)' – upicik

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) 

会比添的回答快一点......

+0

如果我有另一个idBase进行比较,如何在此添加另一个内部连接? – upicik