如何使用 LOW_PRIORITY 进行繁重的查询?

Goo*_*bot 5 mysql innodb performance mysql-5.5 update query-performance

UPDATE在管理员级别安排了大量查询,并且由于它们是UPDATE带有多个JOINs 的大量 s,因此消耗了大量资源。

我不希望他们在执行如此繁重的UPDATE任务时阻止最终用户执行基本任务。

LOW_PRIORITY为了这个目的吗?或者我应该遵循另一种策略?

UPDATE LOW_PRIORITY ....
Run Code Online (Sandbox Code Playgroud)

请注意,我的引擎是innoDB.

tom*_*bom 3

LOW_PRIORITY不起作用有两个原因。

  1. 它仅适用于 MyISAM 引擎。
  2. 它只会导致等待,直到不再有正常或HIGH_PRIORITY读取请求。如果您的服务器恰好处于恒定负载下,甚至可能会发生更新根本不执行的情况。

您可以做的是,首先检查SELECT(我的意思是将您重写UPDATE为 a SELECT),您的查询是否高性能,它使用索引来查找要更新的行(检查EXPLAIN)并在必要时添加适当的索引。

然后,当您执行UPDATE语句时,将它们打包到事务中。
InnoDB 引擎将有关当前事务的信息记录在内存缓冲区中。当事务提交或回滚时,日志缓冲区将刷新到磁盘。如果日志缓冲区很小,它可能会在事务结束之前填满,从而需要在知道事务结果之前刷新日志文件。对于已提交的事务,这会导致多个磁盘操作,而不是一次。对于回滚事务,它会导致在缓冲区较大时根本不需要进行写入。要设置日志缓冲区的大小,请调整 my.cnf (Linux) 或 my.ini (Windows) 中的值(如果尚未设置,则添加它)

[mysqld]
innodb_log_buffer_size = 8M
Run Code Online (Sandbox Code Playgroud)

默认值为 1MB。典型值范围从 1MB 到 8MB。大于 8MB 的值没有任何好处。

如果这还不够,您可以使用批量更新行,LIMIT并随着时间的推移分散更新语句,以便行锁不会保持太长时间。

祝你好运。

  • 我从来没有听说过 InnoDB 在提交时更新索引,这看起来相当难以置信。索引的删除是通过标记完成的,并在后台提供服务,但除此之外,我对此持怀疑态度,至少考虑到外键和唯一约束违规的方式不会被延迟。您能在文档或权威来源中引用这一点吗? (3认同)