sql 语句的优化问题

2015-01-08 15:36:40 +08:00
 yeqiu
大约23W条数据
每条数据产生至少
3条delete,1条update
还有可能产生更多的
现在情况是执行完一条数据生成的语句需要1S左右
算下来我需要6个小时才能执行完。

单步执行结果是发现存在一个delete语句中包含了in语句需要1s,

DELETE
FROM
g_re_enterprises_types
WHERE
enterprise_id IN (
SELECT
id
FROM
g_enterprises
WHERE
enterprise_name = '广东百合医疗科技股份有限公司'
);





但是同样的另外一个delete语句中也包含了in语句却只要0.4s
DELETE
FROM
g_enterprises_certificate
WHERE
enterprises_id IN (
SELECT
id
FROM
g_enterprises
WHERE
enterprise_name = '广东百合医疗科技股份有限公司'
);



有没有什么解决的思路?
mysql Ver 15.1 Distrib 10.0.15-MariaDB, for Linux (x86_64) using readline 5.1
3144 次点击
所在节点    MySQL
14 条回复
xiaogui
2015-01-08 15:51:36 +08:00
查看 g_re_enterprises_types 表和 g_enterprises_certificate 表数据量,以及表中 enterprise_id 字段是否有索引?
yeqiu
2015-01-08 16:08:03 +08:00
@xiaogui
索引和外键都是有的,数据量也都差不多
xiaogui
2015-01-08 16:11:22 +08:00
@yeqiu 视图呢?
yeqiu
2015-01-08 16:12:12 +08:00
@xiaogui 视图?什么意思?
msg7086
2015-01-08 16:14:56 +08:00
不贴个EXPLAIN?
iamshaynez
2015-01-08 16:32:29 +08:00
查看执行计划吧,认为执行计划已经比较高效,那么瓶颈基本上就在硬件上了。23w * 4+ 次执行的速度不是单靠优化SQL能解决的。

求教MSSQL用exists替换in能改善性能吗?Oracle是明显改善的,尤其是10以前的版本。
huwsun
2015-01-08 16:44:58 +08:00
考虑批量执行
omegaga
2015-01-08 17:02:48 +08:00
@iamshaynez exists和in的性能比较要看比较吧。如果你指的是
SELECT * FROM A
WHERE EXISTS (
SELECT * FROM B
WHERE A.id = B.id
)

SELECT * FROM A
WHERE A.id IN (
SELECT id FROM B
)
的话,通常来说是没有明显的区别的(execution plan是一样的)。
不过老的版本里IN会被翻译成一串OR。。。。。。那个性能就不能直视了
yeqiu
2015-01-08 17:40:28 +08:00
@msg7086
两个语句的explan是一样的
branchzero
2015-01-08 17:46:24 +08:00
可以考虑先把所有ID查出来汇总到一块儿去重,然后一次性喂DELETE?
yuankui
2015-01-08 20:25:45 +08:00
1. 那里来的update?
2. 这种语句在什么场景下执行?每个请求一次?每天一次?如果每天一次,几秒都是可以接受了,在怎么优化有没有多大收效
3. 有些东西不是单单通过优化sql可以解决的,换个思路。比如把数据全部dump出来,然后分析,然后再喂回去。某些场景下效率会高很多。
mkeith
2015-01-08 20:26:24 +08:00
2个表的数据量不一样吧?
jc4myself
2015-01-09 00:39:59 +08:00
看一下开查询缓存没,或者执行两次同一条select
thinkmore
2015-01-09 09:54:37 +08:00
DELETE
FROM
g_re_enterprises_types
WHERE
enterprise_id exists (
SELECT
id
FROM
g_enterprises
WHERE
enterprise_name = '广东百合医疗科技股份有限公司'
);

我们几百万上千万数据都很快出来,你的为什么会这么慢呢?你explain试一试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/160343

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX