1. 数据库的锁
MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。
- 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
- 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
- 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。不是太常见
锁的使用情况
从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。
2. 数据库引擎
数据库的引擎有4中,分别是Myisam、InnoDB、Memory、Achieve,每种都有各自的适用场景,mysql默认是Innodb。
2.1. InnoDB
InnoDB是目前事务型存储引擎中使用最为广泛的存储引擎
2.1.1 InnoDB的特点如下:
从MySQL5.5版本之后,MySQL的默认内置存储引擎已经是InnoDB了,他的主要特点有:
(1)灾难恢复性比较好;
(2)支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。
(3)使用的锁粒度为行级锁,可以支持更高的并发;
(4)支持外键;
(5)配合一些热备工具可以支持在线热备份;
(6)在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;
(7)对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
2.1.2 InnoDB适合的业务场景:
- 需要事务支持的业务
- 行级锁定对高并发有很好的适应能力,但需要确保查询时通过索引完成。
- 读写及更新都很频繁的场景
- 数据一致性要求较高的业务
- 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可用减少磁盘I/O。
2.2.3 InnoDB的行级锁
分为两种类型,共享锁和排他锁,而在锁定机制的实现过程中为了让行级锁定和表级锁定共存,InnoDB也同样使用了意向锁(表级锁定)的概念,也就有了意向共享锁和意向排他锁这两种。
当一个事务需要给自己需要的某个资源加锁的时候,如果遇到一个共享锁正锁定着自己需要的资源的时候,自己可以再加一个共享锁,不过不能加排他锁。但是,如果遇到自己需要锁定的资源已经被一个排他锁占有之后,则只能等待该锁定释放资源之后自己才能获取锁定资源并添加自己的锁定。而意向锁的作用就是当一个事务在需要获取资源锁定的时候,如果遇到自己需要的资源已经被排他锁占用的时候,该事务可以需要锁定行的表上面添加一个合适的意向锁。如果自己需要一个共享锁,那么就在表上面添加一个意向共享锁。而如果自己需要的是某行(或者某些行)上面添加一个排他锁的话,则先在表上面添加一个意向排他锁。意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。所以,可以说InnoDB的锁定模式实际上可以分为四种:共享锁(S),排他锁(X),意向共享锁(IS)和意向排他锁(IX),我们可以通过以下表格来总结上面这四种所的共存逻辑关系
2.2 MyISAM
2.2.1 MyISAM的特性
① 不支持事务(事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功要么全部失败)。
② 不支持行级锁,仅支持表级锁定(更新时锁整个表)
③ 读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身不会阻塞另外的读。
④ 只会缓存索引:MyISAM可以通过key_buffer_size缓存索引,以大大提高访问性能,减少磁盘I/O,但这个缓存区只会缓存索引,而不会缓存数据。
⑤ 读取速度较快,占用资源相对少。
⑥ 不支持外键约束,但支持全文索引。
⑦ 5.5.5前为默认存储引擎。
2.2.2 适合的业务场景:
- 不需要事务支持的业务
- 读数据比较多的应用
- 数据库修改较少的业务
- 对数据一致性要求不是非常高的业务
- 硬件资源比较差的机器可以用MyISAM