Mysql(MyISAM)的读写互斥锁问题的解决方法

 更新时间:2011年09月27日 00:32:11   作者:  
最近因为数据库读的请求增加,出现了比较严重的读写锁问题,由于主从分离,主服务器很快的执行完了写入的操作,但从库由于有大量的select的查询,会被这些来自主辅同步的update,insert严重堵塞,最后造成所有的Mysql从库负载迅速上升。
由于没办法在短期内增加读的服务器,所以采取对Mysql进行了一些配置,以牺牲数据实时性为代价,来换取所有服务器的生命安全。呵呵,具体相关调整以及思路如下:

MyISAM在读操作占主导的情况下是很高效的。可一旦出现大量的读写并发,同InnoDB相比,MyISAM的效率就会直线下降,而且,MyISAM和 InnoDB的数据存储方式也有显著不同:通常,在MyISAM里,新数据会被附加到数据文件的结尾,可如果时常做一些UPDATE,DELETE操作之后,数据文件就不再是连续的,形象一点来说,就是数据文件里出现了很多洞洞,此时再插入新数据时,按缺省设置会先看这些洞洞的大小是否可以容纳下新数据,如果可以,则直接把新数据保存到洞洞里,反之,则把新数据保存到数据文件的结尾。之所以这样做是为了减少数据文件的大小,降低文件碎片的产生。但 InnoDB里则不是这样,在InnoDB里,由于主键是cluster的,所以,数据文件始终是按照主键排序的,如果使用自增ID做主键,则新数据始终是位于数据文件的结尾。

了解了这些基础知识,下面说说MyISAM几个容易忽视的配置选项:

concurrent_insert:

通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的:

当concurrent_insert=0时,不允许并发插入功能。

当concurrent_insert=1时,允许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省)。

当concurrent_insert=2时,不管表有没有洞洞,都允许在数据文件结尾并发插入。

这样看来,把concurrent_insert设置为2是很划算的,至于由此产生的文件碎片,可以定期使用OPTIMIZE TABLE语法优化。

max_write_lock_count:

缺省情况下,写操作的优先级要高于读操作的优先级,即便是先发送的读请求,后发送的写请求,此时也会优先处理写请求,然后再处理读请求。这就造成一个问题:一旦我发出若干个写请求,就会堵塞所有的读请求,直到写请求全都处理完,才有机会处理读请求。此时可以考虑使用max_write_lock_count:

max_write_lock_count=1

有了这样的设置,当系统处理一个写操作后,就会暂停写操作,给读操作执行的机会。

low-priority-updates:

我们还可以更干脆点,直接降低写操作的优先级,给读操作更高的优先级。

low-priority-updates=1

综合来看,concurrent_insert=2是绝对推荐的,至于max_write_lock_count=1和low-priority-updates=1,则视情况而定,如果可以降低写操作的优先级,则使用low-priority-updates=1,否则使用max_write_lock_count=1。

相关文章

  • MySQL几点重要的性能指标计算和优化方法总结

    MySQL几点重要的性能指标计算和优化方法总结

    下面小编就为大家带来一篇MySQL几点重要的性能指标计算和优化方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL性能参数详解之Max_connect_errors 使用介绍

    MySQL性能参数详解之Max_connect_errors 使用介绍

    这篇文章主要介绍了MySQL性能参数详解之Max_connect_errors 使用介绍,需要的朋友可以参考下
    2016-05-05
  • 更改MySQL数据库的编码为utf8mb4问题

    更改MySQL数据库的编码为utf8mb4问题

    这篇文章主要介绍了更改MySQL数据库的编码为utf8mb4问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • MySQL分区表的基本入门教程

    MySQL分区表的基本入门教程

    这篇文章主要给大家介绍了关于MySQL分区表的基本入门教程,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • MySQL 那些常见的错误设计规范,你都知道吗

    MySQL 那些常见的错误设计规范,你都知道吗

    今天来看一看 MySQL 设计规范中几个常见的错误例子,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法

    MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法

    这篇文章主要介绍了MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法,本文分步骤给大家介绍的非常详细,需要的朋友可以参考下
    2017-07-07
  • MySQL用户与权限的管理详解

    MySQL用户与权限的管理详解

    这篇文章主要介绍了MySQL用户与权限的管理,详细分析了mysql用户密码、权限设置与使用相关操作原理及注意事项,需要的朋友可以参考下
    2019-07-07
  • MySQL binlog 远程备份方法详解

    MySQL binlog 远程备份方法详解

    以前备份binlog时,都是先在本地进行备份压缩,然后发送到远程服务器中,但是这种备份方式非常的不安全,下面通过本文给大家介绍MySQL binlog 远程备份的方法,需要的朋友一起学习吧
    2016-05-05
  • MySQL基础教程之事务异常情况

    MySQL基础教程之事务异常情况

    事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行,下面这篇文章主要给大家介绍了关于MySQL基础教程之事务异常情况的相关资料,需要的朋友可以参考下
    2022-10-10
  • MySQL的中文UTF8乱码问题

    MySQL的中文UTF8乱码问题

    MySQL从4.x版本开始支持Unicode,3.x只有latin1编码。刚工作的时候就开始用MySQL了,用的php存取,网页xxx.php是gb2312的编码,存进去的数据用php取出来是中文,用phpMyAdmin执行select、update、dump都是中文,没有乱码问题。
    2010-05-05

最新评论