首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >慢SQL内连接

慢SQL内连接
EN

Stack Overflow用户
提问于 2017-09-28 07:05:56
回答 3查看 3.1K关注 0票数 1

我在表interim_19上执行67.500行的sql请求。表没有索引,有7列,其中不包含唯一/主键,因为主数据AbonentidBase是重复的,在我拥有的所有数据中,有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秒,无论是

代码语言:javascript
复制
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行,所以.

我已经在尝试索引了,所以也欢迎其他建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-29 01:14:22

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

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

INDEX不需要是“唯一的”。

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

票数 2
EN

Stack Overflow用户

发布于 2017-09-28 07:14:56

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

代码语言:javascript
复制
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列上添加一个索引。正如注释中所建议的,您也可以尝试缩小选择列表。

票数 3
EN

Stack Overflow用户

发布于 2017-09-28 07:21:41

子查询没有索引。尽量避免,只要有可能:

代码语言:javascript
复制
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)

会比蒂姆的回答快一点..。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46462931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档