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