myisam表锁及锁粒度调节

myisam支持表锁,对表的读写是串行执行的,在一定条件下,Myisam表也支持查询和插入操作的并发执行。
Myisam存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1、2
当concurrent_insert为0时,不允许并发插入
当concurrent_insert为1时,若Myisam表中没有空洞(即表的中间没有被删除的行),Myisam允许在一个进程读表的同时,
另一个进程从表尾插入记录,这也是Myisam的默认设置。
当concurrent_insert为2时候,无论Myisam表是否有空洞,都允许在表尾并发插入记录。
Myisam存储引擎的读锁和写锁是互斥的,读写操作是串行的,那么一个进程请求某个Myisam表的读锁,同时另外一个进程也请求同一表
的写锁,MySql会先处理写锁。不仅如此,即使读请求写到锁等待队列,写请求后到,写锁也会查到读锁之前。这是Mysql通常认为写请求
比较重要的原因。因此大量的写请求会阻塞查询操作,从而导致永久阻塞,这也是Myisam为什么不适合高并发的一个原因吧~
Mysql也提供一种折中的办法来调节读写冲突,即给系统参数max_write_lock_count设置一个合理的值。

Myisam锁粒度调节:

1、通过指定启动参数low-priority-updates,使Myiasm引擎默认给予读请求以优先的权利。

2、通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。

3、通过指定insert,update,delete语句的LOW_PRIORITY属性,降低语句的优先级。

posted on 2014-12-04 08:59  liufofu  阅读(288)  评论(0编辑  收藏  举报