• MySQL之存储引擎


    MySQL之存储引擎

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

    功能:

    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和INNODB做个分析和对比:

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

    访问速度快

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

    在磁盘上有三个文件:

    文件名和表名相同,但扩展名不同

    .frm:存储表结构

    .MYD:数据文件

    .MYI:索引文件

    MYISAM的特点:

    1、表级锁定,更新数据时,真个都将锁定

    2、数据库在读写过程中相互阻塞

    支持的存储格式:

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

    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支持缓存,可以减少后台服务器的压力

    innodb三个文件:

    表名.frm (表结构文件)

    表名.idb (既是数据文件,又是索引文件)

    db.opt (属性文件)

    delete from test where name = 郭旗;:如果name字段是一个普通索引,会锁住索引行,对应的主键一并锁住,实际上就是行锁

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

    锁定表,要对一个非索引键进行操作

    当一个事务对非索引列进行操作,因为要全表扫描过滤,所有整张表都会被锁定,另一个事务只能查

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

    for update:排他锁

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

    2、mysql的默认的死锁机制,会选择一个事务作为死锁的牺牲品,直接终止其中一个事务,但是不会自动回滚

    索引只会索行

    非索引锁表

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

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

    1、存储引擎只能innodb

    2、mysql默认隔离级别即可

    如何尽可能的避免死锁:

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

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

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

    4、隔离级别,read commit。可以避免死锁

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

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

    一般来说,我们会在表中配置一个version字段,可以自增。通过自增校验

  • 相关阅读:
    排列数深度搜索解决 n 皇后问题
    【特纳斯电子】基于物联网的空气质量检测-仿真设计
    Linux常见问题解决操作(yum被占用、lsb无此命令、Linux开机进入命令界面等)
    支持亿级标签接入,ClickHouse在广域物联网云平台架构的探索与实践
    Android Jetpack Compose——一个简单的聊天界面
    多帧三角化原理
    2022就业季|Spring认证教你,如何使用 Spring 构建 REST 服务(二)
    22.10.29 CF-1294C
    课程设计报告,Cisco,亿图,三层交换,路由设计
    java的匿名内部类的使用
  • 原文地址:https://blog.csdn.net/wyh20030130/article/details/134253548