小编Ale*_*lex的帖子

SELECT FOR UPDATE与UPDATE,然后SELECT

我已经创建了一个服务应用程序,它使用多线程来并行处理InnoDB表中的数据(大约2-3百万条记录,并且不再需要由应用程序执行与InnoDB相关的查询).每个线程对提到的表进行以下查询:

  1. 开始交易
  2. SELECT FOR UPDATE(SELECT pk FROM table WHERE status ='new'LIMIT 100 FOR UPDATE)
  3. UPDATE(UPDATE表SET状态='已锁定'在X和Y之间是否有pk)
  4. 承诺
  5. DELETE(删除表格WHERE pk BETWEEN X和Y)

来自forum.percona.com的人给了我一条建议 - 不要使用SELECT FOR UPDATE和UPDATE,因为执行事务需要更长的时间(2个查询),并且等待导致的锁定超时.他们的建议是(自动提交):

  1. UPDATE(UPDATE表SET状态='已锁定',线程= Z LIMIT 100)
  2. SELECT(SELECT pk FROM table WHERE thread = Z)
  3. DELETE(删除表格WHERE pk BETWEEN X和Y)

它本来应该提高性能.然而,相反,我得到了更多的死锁,并等待锁定超时比以前...

我读了很多关于优化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
Run Code Online (Sandbox Code Playgroud)

有什么想法为什么优化没有成功?

mysql performance innodb

7
推荐指数
1
解决办法
5496
查看次数

标签 统计

innodb ×1

mysql ×1

performance ×1