【发布时间】:2011-06-28 05:02:33
【问题描述】:
我创建了一个服务应用程序,它使用多线程并行处理位于 InnoDB 表中的数据(大约 2-3 百万条记录,并且应用程序不再执行与 InnoDB 相关的查询)。每个线程对提到的表进行以下查询:
- 开始交易
- SELECT FOR UPDATE(SELECT pk FROM table WHERE status='new' LIMIT 100 FOR UPDATE)
- UPDATE(UPDATE table SET status='locked' WHERE pk BETWEEN X AND Y)
- 提交
- DELETE(从表中删除 X 和 Y 之间的 pk)
forum.percona.com 的人给了我一条建议——不要使用 SELECT FOR UPDATE 和 UPDATE,因为执行事务需要更长的时间(2 个查询),并导致等待锁定超时。他们的建议是(启用自动提交):
- UPDATE(UPDATE table SET status='locked',thread = Z LIMIT 100)
- SELECT (SELECT pk FROM table WHERE thread = Z)
- DELETE(从表中删除 X 和 Y 之间的 pk)
它应该可以提高性能。然而,相反,我遇到了比以前更多的死锁和等待锁超时......
我阅读了很多关于优化 InnoDB 的内容,并相应地调整了服务器,所以我的 InnoDB 设置是 99% 好的。第一个场景运行良好并且比第二个场景更好也证明了这一事实。 my.cnf 文件:
innodb_buffer_pool_size = 512M
innodb_thread_concurrency = 16
innodb_thread_sleep_delay = 0
innodb_log_buffer_size = 4M
innodb_flush_log_at_trx_commit=2
任何想法为什么优化没有成功?
【问题讨论】:
-
您能否举例说明选择和更新查询?如果您通过主键访问行或使用范围索引 - 锁定间隙,则会产生很大的不同。
-
好吧。猜猜我在哪里不去寻求建议......
-
主题添加真实查询,请查看
标签: mysql performance innodb