今天要说的是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 表锁进程非常多的情况的更多相关文章

  1. [转]MySQL 表锁和行锁机制

    本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...

  2. Mysql表锁、行锁、页锁

    参考 http://www.jb51.net/article/50047.htm <MySQL行级锁.表级锁.页级锁详细介绍> 页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住 ...

  3. MySQL表锁和行锁

    锁粒度 MySQL 不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现: InnoDB 存储引擎既支持行级锁(row-level locki ...

  4. mysql表锁、行锁、索引之间暧昧的关系

    MySQL的innodb存储引擎支持行级锁,innodb的行锁是通过给索引项加锁实现的,这就意味着只有通过索引条件检索数据时,innodb才使用行锁,否则使用表锁.根据当前的数据更新语句(UPDATE ...

  5. mysql 表锁——读锁和写锁

    注意, 0.表的索引类型必须是InnoDB.相关链接:http://www.cnblogs.com/CyLee/p/5579672.html 1.如果你使用Navicat Premium,有可能会出现 ...

  6. mysql 表锁问题

    select * from information_schema.INNODB_lock_waits; select * from information_schema.INNODB_locks; S ...

  7. mysql myisam 锁表问题<转>

    转自http://yafei001.iteye.com/blog/1841258 锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用 ...

  8. MySQL- 锁机制及MyISAM表锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许 多用户 共享的资源.如何保证数据并发访问的一致性.有效性是所 ...

  9. MySQL 行锁 表锁机制

    MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑.遇到了可别乱踩.通过本章内容,带你学习MySQL的行锁 ...

随机推荐

  1. 21 pythone【入门指南】:string

    string是很基础的数据结构,来看看string有哪些常用的操作. #!/bin/python #!---encoding: UTF- s = 'abcdefg' #concat s1 = s + ...

  2. pa sslvpn使用手册

    1.浏览器输入https://x.x.x.x 根据电脑操作系统及位数选择下载 2.安装 直接“下一步”,到  输入IP地址x.x.x.x 点击连接会有证书错误提示 此时点击显示证书→本地计算机→安装到 ...

  3. 好文:javascript中的四种循环

    https://juejin.im/entry/5a1654e951882554b8373622?utm_medium=hao.caibaojian.com&utm_source=hao.ca ...

  4. unbutu中安装jdk并编写第一个java程序

    第一部分:安装jdk 1.首先在putty控制台中输入如下命令,检验系统中是否已经装有jdk. java -version 如果显式的结果如下图,则说明没有安装. openjdk是在linux下默认安 ...

  5. Gradle 实战(1)—— 配置环境变量

    背景:Gradle 是一款构建工具,继 Ant .Maven 之后的现代构建工具,我会在接下来的博文中陆续介绍,我在工作中是如何使用 Gradle 的. 下载 Gradle 下面是 Gradle 的官 ...

  6. 数据库存储 datetime,时差问题

    var offset = moment().utcOffset(); var localText = moment.utc(datetime from database).utcOffset(offs ...

  7. html5的离线缓存

    一个离线网络应用程序就是一个URL的列表,html,css,js,图片,或者其他类型的资源. 把这些资源,在本地缓存下来,当你尝试在没有网络连接时访问网络应用程序,你的浏览器将自动切换并使用本地代替. ...

  8. jquery ajax 中实现给变量赋值

    我们在用JQuery的Ajax从后台提取数据后想把它赋值给全局变量,但是却怎么都赋不进,为什么呢? 原因其实很简单,我们用的Ajax是异步操作,也就是说在你赋值的时候数据还没提取出来,你当然赋不进去, ...

  9. c# 关于字典dictionary 按时间排序

    上文中说到sortedlist 排序是键排序,不符合项目要求问题,接着使用字典dictionary 对value 为时间按照升序排序,问题解决.中间涉及到linq的使用.还有其他的写法,但发现下边的写 ...

  10. Python知识

    1   注释 单行注释:#  内容 多行注释:A   """                   ''' 内容            或    内容 "&quo ...