mysql之存储引擎

(一)存储引擎

1、存储引擎:在mysql当中数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧、锁定水平以及最终提供的不同功能和能力

2、功能

(1)mysql将数据存储在文件系统中的一种方式和格式
(2)存储引擎负责执行实际的数据I/O操作
(3)存储引擎介于数据和文件系统之间,数据会先保存到存储引擎,再按照存储引擎的格式保存到文件系统

(二)mysql之存储引擎的分类

1、INNODB:5.5之后,mysql的默认存储引擎(事务性速记引擎)。支持ACID事务,支持行锁、锁表,写入和查询性能比较好

2、MYISAM:5.5之前的默认存储引擎,插入数据的性能较高,查询速度也很优秀,不支持事务

3、MEMORY:所有数据都保存在内存的存储引擎,插入、更新、查询数据,速度比较快,但是占用内存空间比较大,会占用和数据量成正比的内存空间(mysql一旦重启,内容就会丢失)

4、CSV:由逗号分割数据的存储引擎,会在数据库子目录里为每一个数据表创建一个.csv的文件,就是一个普通的文本文件,每个数据行占用一个文本行,CSV不支持索引

5、archive:非常适合存储大量的独立的、历史数据的引擎,不需要被经常读取,插入数据的速度很快,查询数据的效率比较低

6、blackhole:黑洞(黑洞引擎),写入的任何数据都会消失

(三)MYISAM

1、MYISAM:不支持事务,也不支持外键,只支持全文索引,数据文件和索引文件是分开的,访问速度快

2、适用场景:查询和插入数据为主的应用

3、在磁盘上有三个文件:文件名和表名相同,但扩展名不同

(1).frm:存储的表结构
(2).myd:存储的数据文件
(3).myi:存储的索引文件

mysql之存储引擎_第1张图片

4、修改默认存储引擎(3种)

(1)直接修改
alter table 表名engine=myisam;

mysql之存储引擎_第2张图片

(2)修改配置文件/etc/my.cnf(只对新建表有效)—重启服务

mysql之存储引擎_第3张图片mysql之存储引擎_第4张图片

mysql之存储引擎_第5张图片

(3)创表时修改存储引擎:

mysql之存储引擎_第6张图片

5、MYISAM的特点

(1)表级锁定,更新数据时,整个表都将锁定(隔离级别改为不可重复读
(2)数据库在读写过程中相互堵塞(不能同时对一个表又读又写)

6、myisam支持的存储格式

(1)静态表:固定长度表,静态表是myisam的默认存储格式,静态表中的字段都是非可变字段,每一个记录都是固定长度。存储块,方便缓存,有了故障容易恢复,缺点是占用空间比较多
(2)动态表:动态表可以包含可变字段,记录的长度是不固定的,优点是占用空间少,缺点是频繁更新数据,删除记录,会产生碎片,需要定期清理(mysiamchk -r),出现故障恢复比较困难
(3)压缩表:myisamchk工具创建的,占据的空间非常小,每条记录都是单独压缩的,一般不用(了解)

(四)INNODB

1、innodb:支持事务,支持4个事务的隔离级别,5.5之后是mysql的默认存储引擎

①读写阻塞和隔离级别相关
②支持高效的缓存索引以及缓存数据
③表于主键以簇方式存储btree
④支持外键约束,5.5之后innodb也可以支持全文索引
⑤对硬件资源的要求比较高,支持行锁定,也可以支持表锁定(全表扫描)
⑥如果使用like模糊查询,会进行全表扫描,然后所锁定整个表
⑦如果对没有创建索引的字段进行增、删、改,也会进行全表扫描,锁定整个表
⑧使用索引进行增、删、改,则是行级锁定

2、innodb的特点

(1)不保存表的行数,若统计表的行数,会扫描一遍整个表来计算有多少行
(2)自增长字段,innodb中必须包含只有该字段的索引(必须要有索引)
(3)delete清空表,一行一行删,速度比较块(推荐truncate)

3、使用场景

(1)业务需要事务的支持
(2)论坛、微博、对数据一致性比较高的场景
(3)访问量和并发量比较高的场景,innodb支持缓存,可以减少后台服务器的压力

4、三个文件

(1)表名.frm:表结构文件
(2)表名.idb:表的数据文件以及索引文件
(3)db.opt:表的属性文件

mysql之存储引擎_第7张图片

(五)innodb行锁和索引的关系,以及表锁、排他锁、死锁

1、行锁

(1)指定索引:(锁行)
①特点:如果name字段是一个普通索引,会锁住索引行,对应的主键一并锁住,实际上就是行锁

mysql之存储引擎_第8张图片

mysql之存储引擎_第9张图片

mysql之存储引擎_第10张图片

mysql之存储引擎_第11张图片

(2)指定主键:(锁行)
①特点:如果使用的id的字段是主键,innodb对主键使用聚簇索引,锁定整行记录

mysql之存储引擎_第12张图片

mysql之存储引擎_第13张图片

(3)解决方法:提交commit即可

2、锁定表(表锁):要对非索引键进行操作(全表扫描,整张表都被锁住,查询没有问题)

(1)特点:当一个事务对非索引列进行操作,因为要全表扫描,所以整张表都会被锁定,另一个事务只能查。

mysql之存储引擎_第14张图片

mysql之存储引擎_第15张图片

3、死锁(死循环)

死锁(基于排他锁):事务之间相互等待对方资源,最后形成一个环路造成的
(1)for update(排他锁):(一个事务在操作,另一个事务的操作无法执行,只能查)

mysql之存储引擎_第16张图片

mysql之存储引擎_第17张图片

mysql之存储引擎_第18张图片

(2)死锁(基于排他锁):

①发生死锁的时候,数据库会自动选择一个事务作为受害者,然后先解除死锁,再回滚事务
②mysql的默认的死锁机制,会选择一个事务作为死锁的牺牲者,直接终止其中一个事务,但是不会自动回滚

mysql之存储引擎_第19张图片

mysql之存储引擎_第20张图片

mysql之存储引擎_第21张图片

(六)如何尽可能避免死锁(重点)

1、业务的逻辑要合理,以固定的顺序访问表和行

2、如果事务的类型比较复杂,要进行拆分,在业务允许的情况下,可以把大事务拆小(分次执行)

3、在同一事务中,尽可能的一次性锁定所有需要的资源,可以减少死锁的概率

4、隔离级别,如果要避免死锁,可以使用read commit

5、添加合理索引,可以较少死锁的概率

(七)乐观锁

1、乐观锁:不会有任何提示,只是数据不能写入,数据提交更新时,它会进行校验。若发生冲突,数据不生效而已,没有其他的报错或者卡停

2、乐观锁:不报错,数据也不生效

3、一般来说会在表中配置一个version字段,可以自增,通过自增校验查看数据是否冲突(根据version同步,version需要一样)

4、时间戳time stamp

你可能感兴趣的:(mysql,数据库)