MySQL 存储引擎

存储引擎:MySQL当中数据用各种不同的技术存储在文件中,每一种技术都使用的是不同的存储机制,索引技巧 锁定水平。以及最终提供的不同功能和能力,这写就是我们说的存储引擎。

功能:

1,mysql将数据存储在文件系统中的一种方式和格式

2,存储引擎负责执行数据I/O操作。

3,存储引擎介于数据和文件系统之间,数据会先保存到存储引擎,再按照存储引擎的格式保存到文件系统。

mysql的存储引擎的分类:

1,INNODB:5.5之后MySQL的默认存储引擎。又叫做事务性速记引擎

支持ACID事务,支持行锁,锁表。写入和查询性能比较好。

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

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

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

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

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

查看mysql的存储引擎:show engines\G;

INNODB和MYISAM做个分析对比:

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

适用场景:查询和插入为主的应用。

在磁盘上有三个文件:

文件名和表名相同。但扩展名不同:

.fm 存储的表结构

.MYD 数据文件

.MYI 索引文件

如何修改:

1,在配置文件里修改:但只对新建的表生效

2,直接修改:

alter table 表名 engine=myisam(自己选择的引擎)

3,在创建表的时候修改引擎

MySQL 存储引擎_第1张图片

MYISAM的特点:

1,表级锁定,在更新任何表的时候

2,数据库在读写过程中相互阻塞。不能对一个表又读又写

支持的存储格式:

1,静态表,固定长度表,静态表式myisam的默认存储格式。静态表中字段都是非可变字段。每个记录都是固定长度的。存储快2,方便存储,有了故障容易恢复。缺点是占用空间比较多。

2,动态表,动态表可以包含可变字段,记录的长度是不固定的。优点的占用空间少。频繁更新数据,删除记录,会产生碎片。需要定期清理。myisamchk -r 出现故障恢复比较困难。

3,压缩表:myisamchk工具创建的,占据空间小,每一条记录都是单独压缩的。

INNODB:

支持事务,支持4个事务的隔离级别。5.5之后是MySQL的默认存储引擎。

读写阻塞和隔离级别相关。

支持高效的缓存索引以及缓存数据。

表与主键以簇方式存储BTREE。

支持外键约束,5.5之后INNODB也支持全文索引。

硬件要求比较高。

支持行级锁定,也可以支持表锁定(全表扫描)。

1,使用like模糊查询,会对行全表扫描,锁定整个表

2,对没有创建索引的字段进行查询,也会进行全表扫描。锁定整个表。

3,使用索引,进行增删改,则是行级锁定。

innodb的特定:

1,不保存表的行数,统计表的行数,会扫描一遍整个表来计算有多少行。

2,自增长字段,INNODB必须包含只有该字段的索引

3,delete清空表,是一行一行删,推荐速度比较快 truncate

适用场景:

1,业务需要事务的支持。

2,论坛,微博,对数据一致性比较高的场景

3,访问量和并发量比较高的场景,innodb支持缓存,减少后台服务器的压力。

三个文件:

cd /usr/local/mysql/data/chen/

表名:.frm (表结构文件)

表名:.idb (即是表数据文件也是表索引文件)

表名:dp.opt (表属性文件) 所有的属性文件保存在一块

innodb行锁和索引的关系

行级锁定:

如果说使用的id的字段是主键,innodb对主键使用聚簇索引,锁定整行的记录

innodb锁表,要对一个非索引键进行操作,没有索引要对全表进行扫描。整张表都会被锁定,另一个事务只能查。

排他锁:只有自己事务提交操作之后,别的事务才能操作。悲观锁。

对一行进行排他锁

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

死锁:事务之间相互等待对方资源,最后形成一个环路造成的。

1,当死锁发生时候,数据库会自动选择一个事务作为受害者,然后先解除死锁在回滚事务。

2,发生死锁mysql的默认机制,会选择一个事务作为死锁的牺牲品。直到结束,可以手动回滚。

索引只会锁表

非索引锁表

排他锁,一个事务在操作,另一个事务的操作无法执行,只能查,只能加一个。

死锁,会自动选择一个事务作为牺牲品,结束死锁

1,存储引擎只能是innodb

2,mysql默认隔离级别即可。

如何尽可能的避免死锁:

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

2,如果事务的类型比较复杂,要进行拆分,在业务允许的情况下,把大事务拆小。

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

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

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

核心内容:索引和行锁之间的关系 非索引的锁表,以及死锁。排他锁

innodb的机制,和存储文件格式。

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