MySQL存储引擎InnoDB

发布于:2024-08-02 ⋅ 阅读:(61) ⋅ 点赞:(0)

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。

问:如何避免死锁的情况出现?

  • 以固定的顺序访问表和行
  • 大事务尽量拆分成小事务,事务越复杂,出现问题的可能越大,也难以排查
  • 为表添加合理的索引!