1. 存储引擎的概念
存储引擎就是数据库存储数据的机制,索引的技巧以及锁定水平的集合。直白点说就是存储的方式和存储的格式。
存储引擎也属于MySQL当中的组件,实际上执行的就是数据的读写I/O。
2. MySQL存储引擎的分类
MySIAM :MySQL-5.5版本之前默认的存储引擎是 MySIAM,插入的速度和查询速度很快,但是不支持事务。这个版本已经极少使用了。
INNODB :MySQL-5.5版本之后默认开始使用INNODB引擎,事务型速记存储引擎,支持ACID,支持行级锁定。现在常见的是5.7版本或者8.0以上版本。
Memory :内存型存储引擎,数据在写入时都保存在内存当中,一旦断电或重启,内存中的数据全部丢失。使用的也少。
CSV :逗号分割数据的存储引擎,数据文件以.csv文件保存,能和execl兼容。保存的文件就是一个普通的文本文件,没有加密,也不支持索引。先已基本淘汰。
3. INNODB存储引擎
InnoDB的特点
- 读写阻塞(锁表)和事务的隔离级别
- 能够高效的缓存数据,支持多种类的索引
- 表的索引的类型默认是B-TREE
- 支持外键,支持全文索引
- 对硬件资源要求较高
- 行级锁定:多用户同时对数据库进行读写时,会把行锁住,禁止操作。
模糊查询:
- like进行查询时,会进行全表扫描,在扫描的过程中锁定整个表。
- 如果对没有创建索引的列进行查询时,也会锁定整个表。
- 如果查询的是索引列,锁定条件的行,即行锁定。
查询当前存储引擎:
#查询存储引擎
show engines;
#默认存储引擎修改
vim /etc/my.cnf
default-storage-engine =
4. 行锁 死锁 排他锁
行锁是通过索引来实现的,但如果没有索引,InnoDB会使用默认的隐藏索引来对记录进行加锁。
加了索引就是锁行,没加索引就会锁表。
mysql默认是自动提交写入,运行后即时commit到数据库;
oracle则运行后需要手动commit,否则不会写入到数据库。
死锁:deadlock :事务相互等待对方的资源,最后形成一个环路造成的。
如果发生了死锁,数据库会自动选择一个事务作为受害者,会回滚该事务以解除死锁。
而MySQL会终止其中一个事务,但是不回滚。
排他锁:for update :又叫写锁,当一个事务的操作未完成时,其他事务可以读取但是不能写入,即不能update或delete。
问:如何避免死锁的情况出现?
- 以固定的顺序访问表和行
- 大事务尽量拆分成小事务,事务越复杂,出现问题的可能越大,也难以排查
- 为表添加合理的索引!