线上系统需要在白天向数据库中load数据,由于使用的是MyISAM存储引擎,该存储引擎的锁为表级锁,所以在写入的过程中会锁表,但是无法保证在写入过程中没有查询,所以需要支持并发读写,MySQL官方文档说支持这种操作,但是还是得实际测试
首先在不做任何修改的情况下,load数据的时候做查询,不出意外出现了表锁,导致查询结果不出来,如下:
通过上图可见,查询一直在等待写的表级锁
查询MySQL官网文档,说需要设置concurrent_insert =ALWAYS,支持并发写
修改配置项,重启,再次测试,发现读还是在等待表的锁.......
继续查询MySQL文档,后面发现,后面发现Load的的格式如下
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES
[STARTING BY '']
[TERMINATED BY '\n']
]
[IGNORE number LINES]
[(col_name,...)]
即load的时候,可以选择并发或者读优先,在加上CONCURRENT后,可以并发读写总结,在向MyISAM load数据时,如果要实现读不锁,1、配置concurrent_insert =ALWAYS,2、load加上CONCURRENT选项