`
kavy
  • 浏览: 890979 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 
阅读更多


最近因为数据库读的请求增加,出现了比较严重的读写锁问题,由于主从分离,主服务器很快的执行完了写入的操作,但从库由于有大量的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。

 

http://www.jb51.net/article/28404.htm

分享到:
评论

相关推荐

    MySQL存储引擎解析.doc

    锁类型则分为读锁(共享锁)和写锁(互斥锁)。读锁允许多个用户同时读取数据而不影响其他读操作,但不允许写操作;写锁会阻止其他用户读取或修改被锁定的数据,直到锁被释放。 创建MyISAM类型表的命令如下: ```...

    MySQL中的行级锁、表级锁、页级锁

    表级锁分为读锁(共享锁)和写锁(排他锁),读锁允许其他事务读取但阻止写入,写锁则阻止任何其他读写操作。表级锁的优点在于加锁速度快,资源消耗小,但其缺点也显而易见,即并发度低。当一张表被锁定时,所有需要...

    Speedemy-MySQL-Configuration-Tuning-Handbook.pdf

    - innodb_buffer_pool_instances:通过增加缓冲池实例的数量可以减少全局互斥锁的争用,提升并发处理能力。 - innodb_thread_concurrency:这个变量用于控制InnoDB线程并发数量,帮助更好地控制性能。 - skip_...

    Java面试Mysql.pdf

    - InnoDB中的锁算法包括自旋锁、互斥锁、读写锁等。 - MySQL中的锁类型有:共享锁(读锁)、排他锁(写锁)、意向锁等。 9. **锁与并发效率**: 适当的锁机制可以保证数据一致性,但过度的锁定会影响并发性能。...

    Mysql高性能学习笔记01借鉴.pdf

    读锁之间不互斥,但写锁具有较高优先级,会阻塞其他读写操作。 - 行锁:存储引擎特有的功能,InnoDB是最典型的行级锁定存储引擎。InnoDB实现的行锁通过多版本并发控制(MVCC)来提升并发性能。 - MVCC:在...

    mdl——lock.docx

    了解MDL锁的工作原理和排查方法,有助于我们在面对锁等待问题时,能够更有效地诊断和解决问题,避免对业务造成影响。在日常数据库管理中,应尽量减少长时间持有MDL锁的事务,以优化并发性能和提升系统的响应速度。

    MySql 知识点之事务、索引、锁原理与用法解析

    - MyISAM引擎使用表级锁,读写互斥,适合读多写少的场景。 - InnoDB引擎使用行级锁,减少锁冲突,提高并发性能。行级锁有两种主要类型:共享锁(读锁)和排他锁(写锁)。例如,`FOR UPDATE` 和 `LOCK IN SHARE MODE...

    聊一聊MyISAM和InnoDB的区别

    此外,MyISAM只支持表级别的锁定,当读写操作并存时,可能会导致写请求长时间阻塞,因为读锁和写锁是互斥的。这使得MyISAM在高并发的读写环境中性能下降,尤其是当有大量的查询和修改操作时。 与之相比,InnoDB是...

    一线互联网公司面试题目

    **ConcurrentHashMap锁机制**、MyISAM与InnoDB的区别、MySQL性能优化:ConcurrentHashMap使用分段锁,MyISAM不支持事务,InnoDB支持行级锁。 36-38. **Linux日志查看**、**网络进程查看**、**统计二进制位1的数量*...

    一份招PHP高级工程师的面试题.pdf

    13. **多进程/线程同步**:可以使用互斥锁(Mutex)、信号量(Semaphore)等机制解决。 14. **文件上传**:涉及`move_uploaded_file`函数和`$_FILES`全局变量。 15. **MySQL存储引擎**:MyISAM适合读取密集型,...

    美团校园招聘历年经典面试题汇总:运维研发岗1

    19. **线程同步方式**:包括互斥锁、信号量、条件变量、读写锁等机制,防止并发访问时的数据竞争问题。 20. **指针与引用**:指针是变量的地址,可以为空、改变指向;引用是别名,必须在声明时初始化且不可改变,...

    java面试资料,面试题最好的面试资料

    25. **MySQL存储引擎**:如InnoDB支持事务,MyISAM不支持,还有Memory、Archive等,各有特点。 以上只是部分内容的概述,面试中可能还会涉及到其他主题,如异常处理、设计原则、数据库优化、网络编程等。深入理解...

    百度持续交付项目组面试题

    **ReentrantLock**是一个可重入的互斥锁,它具有与`synchronized`相同的锁定功能,但是更灵活。 **volatile关键字**用于标记变量的状态,当一个变量被声明为volatile时,任何对该变量的读写操作都直接发生在主存中...

Global site tag (gtag.js) - Google Analytics