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的行锁 ...
随机推荐
- Alley Bird 跳跳鸟源码
<跳跳鸟Alley Bird>是一款敏捷小游戏.<跳跳鸟Alley Bird>采用了点击屏幕操作玩法,非常简单易上手,同时游戏内容也趣味性十足.<跳跳鸟Alley Bir ...
- Git之生成SSH公钥
一 生成公钥 ssh-keygen -t rsa -C "michelangelo@qq.com" -t :密钥类型. -C : 注释.通常用作密钥的名字. 依次按三次回车:默认 ...
- bitcode?
今天在网站上看到一篇关于第三方库不包含bitcode就会报错的文章,感觉剖析得很详细,分享出来,希望可以对iOS初入门者有所帮助.下面我们就一起来看看吧. 用Xcode 7 beta 3在真机(iOS ...
- XSS 攻击的防御
xss攻击预防,网上有很多介绍,发现很多都是只能预防GET方式请求的xss攻击,并不能预防POST方式的xss攻击.主要是由于POST方式的参数只能用流的方式读取,且只能读取一次,经过多次尝试,自己总 ...
- idea spring-boot gradle mybatis 搭建开发环境
使用工具idea 2017.2开发,gradle构建项目,使用的技术有spring-boot.mybatis 1.新建项目 说明:1.src为源码路径,开发主要在src下 2.src/main/jav ...
- Liunx Mkdir
linux mkdir命令: 创建目录 介绍:该命令创建指定的目录名,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录1语法: mkdir [-m] [-p] 目录 ...
- invalid END header解决方法
我在Windows上的eclipse开发了一个java web项目,然后压缩成war包,通过ftp发送到Linux服务器上,Tomcat先shutdown,再startup.按理说,会在webapps ...
- CODE[VS]4228 小猫爬山 小猫爬山
原题链接 第一眼还以为是贪心,然后随便找了几组例子瞬间推翻贪心的想法.发现\(n\leqslant18\),显然是用爆搜+剪枝. 爆搜主体我是对小猫进行枚举,判断增添缆车,其实这是一个比较慢的搜法,而 ...
- BZOJ 2594 水管局长 - LCT 维护链信息
Solution 由于链信息不好直接维护, 所以新建一个节点存储边的权值, 并把这个节点连向 它所连的节点 $u$, $v$ $pushup$中更新维护的 $mx$ 指向路径上权值最大的边的编号. 由 ...
- LIbreOJ #6011. 「网络流 24 题」运输问题 最小费用最大流
#6011. 「网络流 24 题」运输问题 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...