MySQL的myisam引擎表锁优化
来源:互联网 发布:淘宝上靠谱的法国代购 编辑:程序博客网 时间:2024/05/17 23:41
MyISAM在读操作占主导的情况下是很高效的。特别是count(*)操作,简直无敌了。 可一旦出现大量的读写并发,由于table lock的原因,同InnoDB相比,MyISAM的效率就会直线下降. 而且,MyISAM和InnoDB的数据存储方式也有显著不同: 通常,在MyISAM里,新数据会被附加到数据文件的结尾,可是做了一些DELETE操作之后,数据文件就不再是连续的,形象一点来说,就是数据文件里出现了很多hole,此时再插入新数据时,按缺省设置会先看这些hole的大小是否可以容纳下新数据,如果可以,则直接把新数据保存到hole里,反之,则把新数据保存到数据文件的结尾。之所以这样做是为了减少数据文件的大小,降低文件碎片的产生。
但InnoDB里则不是这样,在InnoDB里,由于主键是cluster的,所以,数据文件始终是按照主键排序的,如果使用自增ID做主键,则新数据始终是位于数据文件的结尾。 了解了这些基础知识,下面说说MyISAM几个容易忽视的配置选项:
concurrent_insert:
通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的:
当concurrent_insert=0时,不允许在SELECT操作的时候,并发执行INSERT。
当concurrent_insert=1时,如果表里面没有hole(可能性不大吧),SELECT操作的时候,可以并发执行INSERT,新数据位于数据文件结尾(缺省)。如果同时有多个INSERT操作,这些INSERT是串行执行的。
当concurrent_insert=2时,不管表有没有hole,在select操作的时候,都允许在数据文件结尾并发执行INSERT。如果同时有多个INSERT操作,这些INSERT是串行的。而且一旦select释放了lock之后,INSERT还是会首先尝试插入数据到hole里面。 For a table with a hole, new rows are inserted at the end of the table if it is in use by another thread. Otherwise, MySQL acquires a normal write lock and inserts the row into the hole.
設置方法:
1,my.cnf配置文件中加入concurrent_insert=**
2,重启mysql
3,mysql> show variables like '%concurrent_insert%';
查询的结果有3种,对应数值情况如下
NERVER : 0
AUTO : 1
ALWAYS:2
从5.5.3版本开始concurrent_insert参数用枚举值默认为AUTO。
1,使用concurrent_insert=1的优化
MySQL 的表级锁定对于读和写是有不同优先级设定的,默认情况下是写优先级要大于读优先级。所以,如果我们可以根据各自系统环境的差异决定读与写的优先级。如果我们的系统是一个以读为主,而且要优先保证查询性能的话,我们可以通过设置系统参数选项 low_priority_updates=1,将写的优先级设置为比读的优先级低,即可让告诉MySQL 尽量先处理读请求。当然,如果我们的系统需要有限保证数据写入的性能的话,则可以不用设置low_priority_updates参数了。
2, 使用concurrent_insert=2的优化
当concurrent_insert=2,至于由此产生的文件碎片,可以定期使用OPTIMIZE TABLE语法优化。
max_write_lock_count:
缺省情况下,写操作的优先级要高于读操作的优先级,即便是先发送的读请求,后发送的写请求,此时也会优先处理写请求,然后再处理读请求。这就造成一个问题:一旦我发出若干个写请求,就会堵塞所有的读请求,直到写请求全都处理完,才有机会处理读请求。此时可以考虑使用max_write_lock_count: max_write_lock_count=2 有了这样的设置,当系统处理2个写操作后,就会暂停写操作,给读操作执行的机会。
low-priority-updates:
我们还可以更干脆点,直接降低写操作的优先级,给读操作更高的优先级。 low-priority-updates=1
综合来看,concurrent_insert=2是绝对推荐的,但是要定期optimize table. 至于max_write_lock_count=1和low-priority-updates=1,则视情况而定,如果可以降低写操作的优先级,则使用low-priority-updates=1,否则使用max_write_lock_count=2。
- MySQL的myisam引擎表锁优化
- myisam引擎的表锁优化
- MySQL中MyISAM引擎优化
- mysql的 myisam引擎锁问题
- Mysql MyISAM引擎的特征
- mysql myisam引擎压缩表
- MYSQL的存储引擎介绍------MyISAM引擎
- MyISAM存储引擎的表级锁定优化
- MySQL MyISAM和InnoDB引擎的写入速度优化比较,分页速度优化
- mysql myisam存储引擎关于锁的3个参数
- mysql修改表的存储引擎(myisam<=>innodb)
- mysql修改表的存储引擎(myisam<=>innodb)
- MySQL的MyISAM和InnoDB存储引擎表结构
- mysql更改表引擎INNODB为MyISAM的方法总结
- Mysql 表引擎INNODB 和 MyISAM 的方法总结
- mysql更改表引擎INNODB为MyISAM的方法总结
- MySQL存储引擎MyISAM和InnoDB的区别及mysql优化
- MySQL存储引擎MyISAM和InnoDB的区别及mysql优化
- HDOJ1874 畅通工程续(floyd)
- 数学(转)
- 所发生的发生的
- 程序中文乱码问题解决大全
- ROUND 4の NEERC Eastern Subregional2011
- MySQL的myisam引擎表锁优化
- SPICE协议在Android上的几个优化要点
- python下载hadoop天气数据
- Android蓝牙开发
- adb常用命令总结
- 空格替换
- 排序算法的C语言实现-快速排序
- hdu 5358(尺取法)
- HDOJ066 一个人的旅行(dijkstra)