MyISAM读写并发优化
2015-07-24 14:44
295 查看
MyISAM在读操作占主导的情况下是很高效的。可一旦出现大量的读写并发,同InnoDB相比,MyISAM的效率就会直线下降,而 且,MyISAM和InnoDB的数据存储方式也有显著不同:通常,在MyISAM里,新数据会被附加到数据文件的结尾,可如果时常做一些 UPDATE,DELETE操作之后,数据文件就不再是连续的,形象一点来说,就是数据文件里出现了很多洞洞,此时再插入新数据时,按缺省设置会先看这些
洞洞的大小是否可以容纳下新数据,如果可以,则直接把新数据保存到洞洞里,反之,则把新数据保存到数据文件的结尾。之所以这样做是为了减少数据文件的大 小,降低文件碎片的产生。但InnoDB里则不是这样,在InnoDB里,由于主键是cluster的,所以,数据文件始终是按照主键排序的,如果使用自 增ID做主键,则新数据始终是位于数据文件的结尾。
了解了这些基础知识,下面说说MyISAM几个容易忽视的配置选项:
concurrent_insert:
通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的:
SET GLOBAL concurrent_insert = 2; 设置,
SHOW GLOBAL VARIABLES LIKE '%concurrent_insert%';查看
当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。
myisam_max_[extra]_sort_file_size足够大
delay_key_write减少io,提高写入性能
bulk_insert_buffer_size
concurrent_insert 设置为2
read_rnd_buffer_size random scan 使用
read_buffer_size 顺序扫描表使用
key cache 的三种方式
key cache 预加载
SET GLOBAL hot_cache.key_buffer_size=16m
SET BLOBAL cold_cache.key_buffer_size=16m
CACHE INDEX example.top_message IN hot_cache
CACHE INDEX example.event IN cold_cache
LOAD INDEX INTO CACHE example.top_message,example.event IGNORE LEAVES
LOAD INDEX INTO CACHE example.user IGNORE LEAVERS,expamle.groups
洞洞的大小是否可以容纳下新数据,如果可以,则直接把新数据保存到洞洞里,反之,则把新数据保存到数据文件的结尾。之所以这样做是为了减少数据文件的大 小,降低文件碎片的产生。但InnoDB里则不是这样,在InnoDB里,由于主键是cluster的,所以,数据文件始终是按照主键排序的,如果使用自 增ID做主键,则新数据始终是位于数据文件的结尾。
了解了这些基础知识,下面说说MyISAM几个容易忽视的配置选项:
concurrent_insert:
通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的:
SET GLOBAL concurrent_insert = 2; 设置,
SHOW GLOBAL VARIABLES LIKE '%concurrent_insert%';查看
当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。
myisam_max_[extra]_sort_file_size足够大
delay_key_write减少io,提高写入性能
bulk_insert_buffer_size
concurrent_insert 设置为2
read_rnd_buffer_size random scan 使用
read_buffer_size 顺序扫描表使用
key cache 的三种方式
key cache 预加载
SET GLOBAL hot_cache.key_buffer_size=16m
SET BLOBAL cold_cache.key_buffer_size=16m
CACHE INDEX example.top_message IN hot_cache
CACHE INDEX example.event IN cold_cache
LOAD INDEX INTO CACHE example.top_message,example.event IGNORE LEAVES
LOAD INDEX INTO CACHE example.user IGNORE LEAVERS,expamle.groups
相关文章推荐
- switch(String s)是在jdk1.7之后才出现,但是编译器又要求使用较低版本。
- 犀牛——第6章对象 6.3删除属性
- 引用 指针的区别
- 用adb启动app
- dubbo(分布式架构)+zookeeper(注册中心)+spring(provider和consumer) 基本使用
- 又纠结activiti
- 第64讲:Scala中隐式对象代码实战详解
- java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
- VS2010 LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 的解决方法
- 在spring中使用MethodInterceptor实现aop(附项目中demo)
- 《重构:改善既有代码的设计》(三) 第6章 重新组织函数
- Oracle使用imp导入dmp数据提示:只有DBA才能导入有其他DBA导入的文件
- JAVA抽象类和接口的理解
- BestCoder Round #48 ($) (hdu 5284、hdu 5285)
- webbench压力测试工具
- android 4.2以上版本永不休眠
- [多校2015.02.1004 dp] hdu 5303 Delicious Apples
- 黑马程序员—多线程
- Struts2注解 特别注意
- 密码低、中、高三个级别的样式设定