MyISAM几个容易忽视的配置选项

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

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

concurrent_insert:优化

一般来讲,在MyISAM里读写操做是串行的,但当对同一个表进行查询和插入操做时,为了下降锁竞争的频率,根据concurrent_insert的设置,MyISAM是能够并行处理查询和插入的:.net

当concurrent_insert=0时,不容许并发插入功能。
当concurrent_insert=1时,容许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省)。
当concurrent_insert=2时,无论表有没有洞洞,都容许在数据文件结尾并发插入。blog

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

max_write_lock_count:get

缺省状况下,写操做的优先级要高于读操做的优先级,即使是先发送的读请求,后发送的写请求,此时也会优先处理写请求,而后再处理读请求。这就形成一个问题:一旦我发出若干个写请求,就会堵塞全部的读请求,直到写请求全都处理完,才有机会处理读请求。此时能够考虑使用max_write_lock_count:it

max_write_lock_count=1io

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

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。

参考资料:

Concurrent Inserts
Table Locking Issues

 

转:http://blog.csdn.net/phphot/archive/2009/06/04/4242031.aspx

相关文章
相关标签/搜索