【问题标题】:Slow SQL INNER JOIN慢 SQL INNER JOIN
【发布时间】:2018-03-09 19:55:56
【问题描述】:

我正在对表 interim_19 执行 67.500 行的 sql 请求。表没有索引,并且有 7 列,其中非唯一/主键,因为主要数据 AbonentidBase 是重复的,在所有数据中我有 7-8 个不同的 idBases 和 ~10.000 个不同的 @ 987654325@,而其他数据如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 秒。我知道内部连接确实将每一行与第二个表上的每一行进行比较,但这不应该花这么长时间。 OFC 它会重复,但我需要所有 7+7 行,所以...

P.S 我已经在尝试索引它,所以也欢迎其他建议。

【问题讨论】:

  • 我没有看到派生表的原因并直接加入表。此外,仅选择您实际需要的列。 “SELECT *”对你没有任何好处。
  • 是 mySql 还是 SQL Server ?请编辑您的标签

标签: mysql join indexing


【解决方案1】:

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

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 列上添加索引。根据 cmets 中的建议,您还可以尝试缩小选择列表的范围。

【讨论】:

  • 如果我有另一个 idBase 来比较,我如何在这里添加另一个内部连接?
  • 如果您还有其他问题,那么您可能想提出一个新问题,而不是更改您当前的问题。
  • 不,我的意思是,我想在此查询中添加另一个联接。应该是: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)
【解决方案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)

会比蒂姆的回答快一点……

【讨论】:

  • 如果我有另一个 idBase 来比较,我如何在这里添加另一个内部连接?
【解决方案3】:

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

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

INDEX 不需要是“唯一的”。

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

【讨论】:

  • 谢谢,在两个项目上添加索引将它从 147 秒提高到 0.8 秒。
猜你喜欢
  • 2015-10-31
  • 2013-11-11
  • 1970-01-01
  • 2020-01-09
  • 2015-03-03
  • 2013-07-01
  • 2016-12-04
  • 2015-07-12
  • 2020-08-23
相关资源
最近更新 更多