MYSQL存储引擎
存储引擎:mysql当中数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧 锁定水平以及最终提供的不同功能和能力,这些就是我们说的存储引擎
功能:
- mysql将数据存储在文件系统中的一种方式和格式
- 存储引擎负责执行实际的数据I/O操作
- 存储引擎介于数据和文件系统之间,数据会先保存到存储引擎,再按照存储引擎的格式保存到文件系统中。
Mysql的存储引擎的分类:
- INNODB :5.5之后mysql的默认存储引擎,事务性速记引擎。支持ACID事务.支持行锁,锁表。写入和查询性能比较好。
- MYISAM:5.5之前的默认存储引擎,插入数据的性能较高,查询速度也很优秀。但是不支持事务。
- MEMORY:所有的数据都保存在内存的存储引擎。插入数据,更新,查询数据,速度比较快。但是占用内存空间比较大。会占用和数据量成正比的内存空间。Mysql一旦重启,内容就会丢失。
- CSV:由逗号分割数据的存储引擎。他会在数据库子目录里为每一个数据表创建一个.csv的文件。就是一种普通的文本文件。每个数据行占用文本行,csv不支持索引
- Archive:非常适合存储大量的独立的,历史数据的引擎。不需要被经常读取。插入的速度很快,查询的效率比较低。
- Blackhole:黑洞引擎,写入的任何数据都会消失
MYISAM和INNODB做个分析和对比:
MYISAM:不支持事务,也不支持外键,只支持全文索引。数据文件和索引文件是分开的。
?????????访问速度快。
适用场景:查询和插入数据为主的应用
在磁盘上有三个文件:
编译安装:在/usr/local/mysql/data/数据库名 目录下
文件名和表名相同。但是扩展名不同
.frm存储的是表结构
.MYD数据文件
.MYI索引文件
- 表级锁定,更新数据时,整个都将锁定
- 数据库在读写过程中相互阻塞
支持的存储格式:
1.静态表,固定长度表,静态表式myisam的默认存储格式。静态表中字段都是非可变字段。每个记录都是固定长度的。存储快,方便缓存,有了故障容易恢复,缺点是占用空间比较多
2.动态表,动态表可以包含可变字段,记录的长度是不固定的,优点是占用空间少,频繁更新数据,删除记录,会产生碎片。需要定期清理(myisamchk -r)。出现故障恢复比较困难。
3.压缩表,myisamchk工具创建的,占据的空间非常小。每条记录都是单独压缩的
纵向查看存储引擎:
show engines\G;
修改存储引擎
alter table 表名 engine=存储引擎;
通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务,
(这种方式只会对新建表生效)
vim /etc/my.cnf
......
[mysqld]
......
default-storage-engine=INNODB
INNODB:
支持事务:支持4个事务的隔离级别。5.5之后是mysql的默认存储引擎
读写阻塞和隔离级别相关。
支持高效的缓存索引以及缓存数据
表于主键以簇方式存储BTREE
支持外键约束,5.5之后INNODB也可以支持全文索引
硬件资源的要求比较高
支持行锁定
也可以支持表锁定(全表扫描)
- 使用like模糊查询,会进行全表扫描,锁定整个表
- 对没有创建索引的字段进行查询,也会进行全表扫描。锁定整个表
- 使用索引,进行增、删、改、则是行级锁定
innodb的特点:
- 不保存表的行数,统计表的行数,会扫描一遍整个表来计算有多少行
- 自增长字段,INNODB中必须包含只有该字段的索引
- delete清空表,一行一行删,速度比较 truncate
适用场景:
- 业务需要事务的支持
- 论坛,微博,对数据一致性比较高的场景
- 访问量和并发量比较高的场景,innodb支持缓存,减少后台服务器的压力。
三个文件:
表名.frm(表结构文件)
表名.ibd(既是数据文件,又是索引文件)
dp.opt:表的属性文件
行锁
如果name字段是一个普通索引,会锁住索引行,对应的主键一并锁住,实际上就是行锁
终端内部开启事务
外部开启事务无法运行
如果说使用的id的字段是主键,innodb对主键使用的聚簇索引,锁定整行的记录
表锁
锁定表,要对一个非索引键进行操作
当一个事务对非索引列进行操作,因为要全表扫描过滤,所有整张表都会被锁定,另一个事务只能查。
排它锁
for update
死锁:事务之间相互等待对方资源,最后形成一个环路造成的
死锁两种情况:
- 发生死锁的时候,数据库会自动选择一个事务作为受害者,然后先解除死锁,再回滚事务。
- Mysql的默认的死锁机制,会从中选择一个事务作为死锁的牺牲品直接终止其中一个事务,但是不会自动回滚。
索引只会索引
非索引锁表
排他锁,一个事务在操作,另一个事务的操作无法执行,只能查,排它锁只能加一个。
死锁,会自动选择一个事务作为牺牲品,结束死锁
- 存储引擎只能是innodb
- Mysql默认隔离级别即可
如何竟可能的避免死锁:
- 业务的逻辑要合理,以固定的顺序访问表和行
- 如果事务的类型比较复杂,要进行拆分,在业务允许的情况下,把大的事务拆小。
- 在同一事务中,尽可能的一次性锁定所有需要的资源,可以减少死锁的概率
- 隔离级别,red commit可以避免死锁
- 添加合理索引。可以减少死锁的概率
for update 排它锁
排它锁也可以叫悲观锁
乐观锁:不会有任何提示,只是数据不能写入。数据提交更新时,进行校验,发生冲突,数据不生效而已,没有其他的报错或者卡停。
一般来说,我们会在表中配置一个version字段,可以自增,通过自增校验来查看数据是否冲突。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!