决定MyISAM的Select&Insert&Update并发性能的参数
concurrent_insert 通过查看 show variables like '%concurrent%'
0: 表示不能并发,Select, insert之间只能串行执行
1:表中有空洞(删除记录留下的)情况下,阻塞insert; 表中无空洞的情况下,Insert并发插入表尾
2:无论是否有空洞都并发插入表尾
默认情况下, 这个值是1, 所以在既有Select又有insert的情况下,很容易就出现了近似串行的执行场景。
例如:
session 1正在执行一条select语句,需要3秒
session 2未等1执行完,就执行了一条insert, 那么这个insert会等到session 1执行完才能执行(有空洞),同时这个session 2锁住表
session 3也是一条select语句,发现表被session2锁住了,只能等待
session 4也是select语句,同样等待
session 5是insert语句,继续等待
直到session1完成后, session2也完成后, 3,4才能执行,假设3,4也要3秒,那么session 5继续等待,其他session又开始等待。
结论就是, 如果那条语句执行的时间稍微长点, 同时又有insert的话,MyISAM表会非常容易变成串行执行。
解决方法:
1. concurrent_insert=2 坏处就是delete的空洞永远都不去补回来了,浪费空间,浪费了cpu扫描
2. --low-priority-updates启用mysqld,让select有更高优先级
3. 在语句中加上HIGH_PRIORITY, LOW_PRIORITY以定义优先级,让select赶在insert锁定之前执行