MyISAM 使用表级锁定,这意味着 SELECT:s 在 INSERT/UPDATE:s 运行时被阻塞。
为了缓解阻塞 SELECT:s 的问题,建议我使用以下参数配置 MySQL:
low_priority_updates=1
concurrent_insert=2
low_priority_updates=1
使用and有什么缺点concurrent_insert=2
?
这是 MySQL 性能博客中的一篇很棒的文章,其中涵盖了其中的一些内容
锁定优先级。默认情况下,MySQL 将更新视为更高优先级的操作。您可以使用 SELECT HIGH_PRIORITY 或 UPDATE LOW_PRIORITY 来调整它,或者您可以简单地设置 low_priority_updates 选项。无论如何,默认行为意味着任何被长时间运行的 select 阻塞的 UPDATE 语句也将阻塞来自该表的进一步选择——它们必须等到正在等待 SELECT 完成的 UPDATE 执行。这通常没有被考虑在内,人们认为——“好吧。我写我的脚本,所以它会做短暂的更新,所以它不会阻塞任何东西”——如果有长的选择运行,它仍然可能导致完全阻塞。
另一篇文章对 concurrent_inserts 进行了基准测试并强调了可能的缺点,尽管这篇文章现在已经 3 年了。