MyISAM读写并发优化

简介: MyISAM在读操作占主导的情况下是很高效的。可一旦出现大量的读写并发,同InnoDB相比,MyISAM的效率就会直线下降,而 且,MyISAM和InnoDB的数据存储方式也有显著不同:通常...
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

目录
相关文章
|
18天前
|
关系型数据库 MySQL
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-01
【4月更文挑战第18天】MySQL的InnoDB引擎支持行锁,而MyISAM只支持表锁。行锁在事务开始时添加,事务结束时释放,遵循两阶段锁协议。为减少锁冲突影响并发,应将可能导致最大冲突的锁操作放在事务最后。例如,在电影票交易中,应将更新影院账户余额的操作安排在事务末尾,以缩短锁住关键行的时间,提高系统并发性能。
19 4
|
11月前
|
SQL Oracle 关系型数据库
深度解析 MySQL 事务、隔离级别和 MVCC 机制:构建高效并发的数据交响乐(一)
深度解析 MySQL 事务、隔离级别和 MVCC 机制:构建高效并发的数据交响乐
322 0
|
11月前
|
SQL NoSQL 关系型数据库
深度解析 MySQL 事务、隔离级别和 MVCC 机制:构建高效并发的数据交响乐(三)
深度解析 MySQL 事务、隔离级别和 MVCC 机制:构建高效并发的数据交响乐(三)
349 0
|
11月前
|
SQL 存储 NoSQL
深度解析 MySQL 事务、隔离级别和 MVCC 机制:构建高效并发的数据交响乐(二)
深度解析 MySQL 事务、隔离级别和 MVCC 机制:构建高效并发的数据交响乐(二)
353 0
|
11月前
|
SQL 存储 缓存
高并发读写优化方案
系统优化方案与高并发读写优化方案,及其优缺点。
400 0
|
存储 SQL 缓存
|
安全 索引
Lucene 索引的并发读写
lucene能够很好地支持多线程/进程 访问。 1.并发读 一个索引可以被多个进程的IndexReader打开。一个进程中,推荐IndexReader被单例多线程使用。 IndexReader类不仅是线程安全的,还是线程友好的,即友好地支持并发访问,代码中同步代码(synchronized)块并不多。 2.单独写 对于一个索引来说,一次只能打开一个IndexWriter。 2
2011 0
|
关系型数据库 存储 数据库
InnoDB并发如此高,原因竟然在这?
《InnoDB行锁,如何锁住一条不存在的记录?》埋了一个坑,没想到评论反响剧烈,大家都希望深挖下去。原计划写写InnoDB的锁结束这个case,既然呼声这么高,干脆全盘系统性的写写InnoDB的并发控制,锁,事务模型好了。
713 0
|
关系型数据库
MyISAM加锁分析
MyISAM加锁分析为什么加锁你正在读着你喜欢的女孩递给你的信,看到一半的时候,她的好闺蜜过来瞄了一眼(假设她会隐身术,你看不到她),她想把“我很喜欢你”改成“我不喜欢你”,刚把“很”字擦掉,“不”字还没写完,只写了一横一撇,这时候你正读到这个字,她怕你察觉到也就没继续往下写了,这时候你读到的这句...
1048 0
|
SQL 关系型数据库 MySQL
MySQL探秘(六):InnoDB一致性非锁定读
一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。如果读取的行正在执行DELETE或UPDATE操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB会去读取行的一个快照。

热门文章

最新文章