mysql 表锁进程非常多的情况
今天要说的是mysql 的 MYISAM引擎下的表锁问题。
通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的:
当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。
set-variable = max_allowed_packet=1M
set-variable = net_buffer_length=2K
在myisam engine下
1. 尽量使用insert into table_name values (…), (…..),(…..)这样形式插入数据,避免使用inset into table_name values (); inset into table_name values (); inset into table_name values ();
2 增加bulk_insert_buffer_size(默认8M)
3 如果是非空表,使用alter table table_name disable keys,然后load data infile,导入完数据在执行:
alter table table_name enable keys. 如果是空表,就不需要这个操作,因为myisam表在空表中导入数据时,是先导入数据然后建立indexs。
4 在插入数据时考虑使用:insert delayed….这样操作实际mysql把insert操作放到队列里面,进行相对集中的插入,速度更快。
5. 使用load data infile 比使用insert 操作快近20倍,尽量使用此操作。
上面这些是网上也查询看的别人写的,确实也比较详细,但是个人使用的时候,针对自己的情况运用了一些配置,开始还可以,但是随着访问pv量增大之后,就开始出现了一些问题。我们也用了 concurrent_insert = 2 这个参数,但是后面我选择了 low-priority-updates=1 这个参数配置,运行之后发现表的写和读的操作开始都在循环增多,因为我们的网站接口读和写的操作都比较多,开始也一直在排查其他问题,用 show processlist 命令查看mysql里面 Waiting for table level lock 这个表锁的进程占了百分之九十多,然后程序反应非常慢,而且还会间歇性出现 502 的报错。
我们的服务器是32G内存,双8核cpu的配置:
max_connections=10000
max_connect_errors = 100000
open_files_limit = 65535
max_user_connections=8000
#back_log = 1024
key_buffer_size = 10G
table_open_cache = 10000
sort_buffer_size = 16M
net_buffer_length = 8K
read_buffer_size = 16M
myisam_sort_buffer_size = 128M
query_cache_min_res_unit = 2K
query_cache_limit = 8M
group_concat_max_len = 2147483647
concurrent_insert = 2
low-priority-updates=1
thread_concurrency=32
query_cache_size = 512M
query_cache_type=1
thread_cache_size = 512
max_allowed_packet = 32M
read_rnd_buffer_size = 16M
tmp_table_size = 1G
join_buffer_size = 16M
bulk_insert_buffer_size=16M
lower_case_table_names=1
thread_stack=512K
这里我简单贴一下配置参数,大家可根据自己的情况,不一定都要照搬。然后我们就是出现了表锁和502的问题,我也检查了好久,适用了很多网上大家发出来的论坛的解决办法,都无济于事。然后自己感觉,日pv达到几千万之后,有一些小的参数调整已经启不了太大作用了。后面才又想到mysiam的引擎方面调整了,这里主要就是我屏蔽了 low-priority-updates=1 这个参数,换成了 max_write_lock_count=1 这个参数,这个含义大家看上面的就有解释,不用我多做解释了,就是让读和写交替进行,不会说一直读或者一直写,然后这个调整对整个网站影响还是比较明显的,流程很多了。随着量增大以后可能还有各种各样的问题,大家根据情况,可以帮到大家最好。
mysql 表锁进程非常多的情况的更多相关文章
- [转]MySQL 表锁和行锁机制
本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...
- Mysql表锁、行锁、页锁
参考 http://www.jb51.net/article/50047.htm <MySQL行级锁.表级锁.页级锁详细介绍> 页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住 ...
- MySQL表锁和行锁
锁粒度 MySQL 不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现: InnoDB 存储引擎既支持行级锁(row-level locki ...
- mysql表锁、行锁、索引之间暧昧的关系
MySQL的innodb存储引擎支持行级锁,innodb的行锁是通过给索引项加锁实现的,这就意味着只有通过索引条件检索数据时,innodb才使用行锁,否则使用表锁.根据当前的数据更新语句(UPDATE ...
- mysql 表锁——读锁和写锁
注意, 0.表的索引类型必须是InnoDB.相关链接:http://www.cnblogs.com/CyLee/p/5579672.html 1.如果你使用Navicat Premium,有可能会出现 ...
- mysql 表锁问题
select * from information_schema.INNODB_lock_waits; select * from information_schema.INNODB_locks; S ...
- mysql myisam 锁表问题<转>
转自http://yafei001.iteye.com/blog/1841258 锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用 ...
- MySQL- 锁机制及MyISAM表锁
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许 多用户 共享的资源.如何保证数据并发访问的一致性.有效性是所 ...
- MySQL 行锁 表锁机制
MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑.遇到了可别乱踩.通过本章内容,带你学习MySQL的行锁 ...
随机推荐
- 21 pythone【入门指南】:string
string是很基础的数据结构,来看看string有哪些常用的操作. #!/bin/python #!---encoding: UTF- s = 'abcdefg' #concat s1 = s + ...
- pa sslvpn使用手册
1.浏览器输入https://x.x.x.x 根据电脑操作系统及位数选择下载 2.安装 直接“下一步”,到 输入IP地址x.x.x.x 点击连接会有证书错误提示 此时点击显示证书→本地计算机→安装到 ...
- 好文:javascript中的四种循环
https://juejin.im/entry/5a1654e951882554b8373622?utm_medium=hao.caibaojian.com&utm_source=hao.ca ...
- unbutu中安装jdk并编写第一个java程序
第一部分:安装jdk 1.首先在putty控制台中输入如下命令,检验系统中是否已经装有jdk. java -version 如果显式的结果如下图,则说明没有安装. openjdk是在linux下默认安 ...
- Gradle 实战(1)—— 配置环境变量
背景:Gradle 是一款构建工具,继 Ant .Maven 之后的现代构建工具,我会在接下来的博文中陆续介绍,我在工作中是如何使用 Gradle 的. 下载 Gradle 下面是 Gradle 的官 ...
- 数据库存储 datetime,时差问题
var offset = moment().utcOffset(); var localText = moment.utc(datetime from database).utcOffset(offs ...
- html5的离线缓存
一个离线网络应用程序就是一个URL的列表,html,css,js,图片,或者其他类型的资源. 把这些资源,在本地缓存下来,当你尝试在没有网络连接时访问网络应用程序,你的浏览器将自动切换并使用本地代替. ...
- jquery ajax 中实现给变量赋值
我们在用JQuery的Ajax从后台提取数据后想把它赋值给全局变量,但是却怎么都赋不进,为什么呢? 原因其实很简单,我们用的Ajax是异步操作,也就是说在你赋值的时候数据还没提取出来,你当然赋不进去, ...
- c# 关于字典dictionary 按时间排序
上文中说到sortedlist 排序是键排序,不符合项目要求问题,接着使用字典dictionary 对value 为时间按照升序排序,问题解决.中间涉及到linq的使用.还有其他的写法,但发现下边的写 ...
- Python知识
1 注释 单行注释:# 内容 多行注释:A """ ''' 内容 或 内容 "&quo ...