文章目录

  • 1 应用优化:
  • 2 mysql并发参数调整:
  • 2.1 max_connections
  • 2.2 back_log
  • 2.3 table_open_cache
  • 2.4 thread_cache_size
  • 2.5 Innodb_lock_wait_timeout
  • 3 MySQL锁:
  • 3.1 引擎与锁分类
  • 3.2 MyISAM表锁
  • 3.3 InnoDB行锁
  • 3.4 InnoDB表锁
  • 3.5 间隙锁
  • 3.6 查看锁情况


1 应用优化:

1.使用连接池,不多说。
2.减少对数据库访问,三种方式:
①.少次——能够一次完成的就不要分两次。
②.缓存——使用缓存减少对数据库访问。
③.负载均衡——可通过主从复制,主机增删改,从机查询,实现读写分离降低单台压力;或者使用分布式架构。

2 mysql并发参数调整:

2.1 max_connections

此参数控制允许连接到MySql的最大数量,默认是151。当状态变量connection_errors_max_connections不为0且一直增长则说明不断有请求因连接数达到最大值而连接失败,此时可以考虑增大max_connections。

MYSQL 并发抢单 mysql并发量_MySQL

2.2 back_log

此参数控制MySQL监听TCP端口时设置的积压请求栈大小,也就是连接数量已经达到最大的时候排队的请求数量。如果排队的请求也大到最大排队量,back_log会将拒绝排队请求直接报错。如果要在短时间内处理大量连接请求,可以考虑增大可排队值back_log。

MYSQL 并发抢单 mysql并发量_MySQL_02

2.3 table_open_cache

此参数用来控制所有SQL语句执行线程可打开表缓存的数量,在执行语句时,每一个线程最少要打开一个表缓存。该参数的值应该根据设置的最大连接数Max_connections以及每个连接执行关联查询中涉及表的最大数量而定。

MYSQL 并发抢单 mysql并发量_MySQL_03

2.4 thread_cache_size

此参数控制MySQL缓存客户服务线程的数量,是MySQL中的线程池,用来加快连接速度。

MYSQL 并发抢单 mysql并发量_MYSQL 并发抢单_04

2.5 Innodb_lock_wait_timeout

此参数调用InnoDB事务的行锁等待时间。如果要加快响应速度可以调小,避免事务长时间挂起。而对于后台运行的批量处理程序可以将行锁的等待时间调大,避免发生大的回滚。

MYSQL 并发抢单 mysql并发量_缓存_05

3 MySQL锁:

3.1 引擎与锁分类

从数据操作粒度来分有行锁和表锁——行锁锁定当前行,表锁锁定整个表。

从数据操作类型来分有读锁和写锁——读锁针对同一份数据同时进行多个操作互不影响,也叫共享锁。写锁在当前操作没完成之间,会阻塞其它任何操作,也称排它锁。

MYSQL 并发抢单 mysql并发量_mysql_06

3.2 MyISAM表锁

此引擎会自动加读写锁,也可以手动加。
准备两张myisam存储引擎表

MYSQL 并发抢单 mysql并发量_MYSQL 并发抢单_07


MYSQL 并发抢单 mysql并发量_加锁_08


总之读锁只阻塞写,写锁阻塞读与写。所以MyISAM只适合用来读操作。

MYSQL 并发抢单 mysql并发量_mysql_09


MYSQL 并发抢单 mysql并发量_MySQL_10


MYSQL 并发抢单 mysql并发量_MYSQL 并发抢单_11

3.3 InnoDB行锁

行锁开销大,加锁慢,会出现死锁,但是锁定粒度小锁冲突概率低,并发度高。

InnoDB正是因为有了行锁才能支持事务。

我们先关闭全局自动提交(重启后失效,要永久有效须在配置文件中更改)

MYSQL 并发抢单 mysql并发量_mysql_12

-- 关闭当话自动提交,set后缺省值为session。只对本会话有效
set autocommit=0;
-- 关闭全局自提交,对当前对话无效
set GLOBAL autocommit=0;
-- 查看会话自动提交设置,缺省值为session
show  VARIABLES LIKE 'autocommit';
-- 查看全局自动提交设置
show  global  VARIABLES LIKE 'autocommit';

MYSQL 并发抢单 mysql并发量_加锁_13


MYSQL 并发抢单 mysql并发量_加锁_14

3.4 InnoDB表锁

如果不通过条件检索数据,那么InnoDB会对整个表加锁,实际效果等同表锁。

MYSQL 并发抢单 mysql并发量_mysql_15

3.5 间隙锁

当使用范围匹配而不是使用等值匹配,并请求共享或排他锁时,InnoDB会给符合条件的已有数据进行加锁。对于键值在匹配范围内但是不存在的记录,叫做间隙,InnoDB

也会对这个间隙(GAP)进行加锁,这种锁机制就是所谓的间隙锁(Next_Key锁)。

MYSQL 并发抢单 mysql并发量_MySQL_16

MYSQL 并发抢单 mysql并发量_缓存_17

3.6 查看锁情况

行锁争用情况:

MYSQL 并发抢单 mysql并发量_MYSQL 并发抢单_18


总结:

1.尽量走索引,避免无索引而升为表锁。

2.合理设计索引缩小锁的范围。

3.尽量减少索引条件与匹配范围避免间隙锁。

4.控制事务大小,减少锁定资源量和时长。

5.在不和业务需求冲突的情况下尽量使用低级别隔离。