MySQL存储引擎

一、MySQL体系结构

MySQL存储引擎_第1张图片

MySQL存储引擎_第2张图片 连接层:
       最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
服务层:
       第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。
引擎层:
       存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过APl和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。
存储层:
      主要是将数据存储在文件系统之上,并完成与存储引擎的交互。

二、存储引擎简介

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。
MySQL默认的存储引擎是InnoDB。

MySQL存储引擎_第3张图片

--查询建表语句

  show create table 表名;

--建表时指定存储引擎

  CREATE TABLE 表名(

    ...

  ) ENGINE=INNODB;

-- 查看当前数据库支持的存储引擎

  show engines;

MySQL存储引擎_第4张图片

其中Engine代表引擎,Support代表是否支持。

三、默认存储引擎InnoDB引擎

MySQL存储引擎_第5张图片

InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB 是默认的 MySQL 引擎。

特点:

  • DML 操作遵循 ACID 模型,支持事务
  • 行级锁,提高并发访问性能
  • 支持外键约束,保证数据的完整性和正确性

文件:

  • xxx.ibd: xxx代表表名,InnoDB 引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。

参数:innodb_file_per_table,决定多张表共享一个表空间还是每张表对应一个表空间

innodb_file_per_table 是一个 MySQL 配置参数,用于指定 InnoDB 存储引擎是否为每个表单独创建一个独立的数据文件。

innodb_file_per_table 参数设置为 ON 时,每个创建的表都会有一个对应的独立数据文件,该文件存储与该表相关的数据。这意味着每个表的数据可以被独立管理和操作,也可以独立进行备份和恢复操作。这种模式下,InnoDB 表空间被分割成多个文件。

innodb_file_per_table 参数设置为 OFF(默认值)时,所有的 InnoDB 表将使用共享的系统表空间,即一个大的共享数据文件(如 ibdata1)。在这种模式下,所有的表共享同一个数据文件,因此表之间的数据并没有明确的物理隔离,可能会导致一些管理和维护上的挑战。

知识点:

查看 Mysql 变量:
  show variables like 'innodb_file_per_table';

从idb文件提取表结构数据:
   (在cmd运行)
  ibd2sdi xxx.ibd

InnoDB 逻辑存储结构:

MySQL存储引擎_第6张图片MySQL存储引擎_第7张图片MySQL存储引擎_第8张图片

InnoDB 是一种流行的存储引擎,用于 MySQL 关系型数据库管理系统。它具有以下几个主要的逻辑存储结构:

  1. 表空间(Tablespace):

    • 共享表空间(Shared Tablespace):默认情况下,所有的 InnoDB 表共享一个共享表空间文件(通常是 ibdata1)。这个文件包含了所有表的数据和索引。
    • 独立表空间(Individual Tablespace):如果启用了 innodb_file_per_table 参数,每个表将拥有自己独立的表空间文件。这些文件位于数据目录中,以表名为基础命名。
  2. 段(Segment):

    • 数据段(Data Segment):存储表的数据。每个表在共享表空间中都有一个对应的数据段。
    • 索引段(Index Segment):存储表的索引。每个表在共享表空间中也有一个对应的索引段。
  3. 区(Extent):

    • 区是磁盘上分配的连续存储区域。一个区通常包含多个页。
    • 页(Page)是 InnoDB 存储引擎的最小单位。每个页默认大小为16KB,包含一部分数据或索引。
  4. 行(Row):

    • InnoDB 存储引擎使用 B+ 树索引结构来组织数据和索引。每个 B+ 树节点中的行存储实际的表数据。

值得注意的是,InnoDB 存储引擎还有其他一些辅助的逻辑结构,如回滚段(Rollback Segment)、撤销日志(Undo Log)等,用于支持事务的 ACID 特性。但这些结构不属于 InnoDB 的主要逻辑存储结构。

这些逻辑存储结构共同工作,使得 InnoDB 存储引擎能够高效地管理和访问数据库表的数据和索引,并提供高性能和可靠的事务处理能力。

四、存储引擎-MyISAM和Memory

4.1  MyISAM存储引擎

MySQL存储引擎_第9张图片

MyISAM 是 MySQL 早期的默认存储引擎。

特点:

  • 不支持事务,不支持外键
  • 支持表锁,不支持行锁
  • 访问速度快

文件:(以MyISAM为存储引擎建立的表,磁盘中默认有下面三个文件 )

  • xxx.sdi: 存储表结构信息
  • xxx.MYD: 存储数据
  • xxx.MYI: 存储索引

4.2  Memory存储引擎

MySQL存储引擎_第10张图片

Memory 引擎的表数据是存储在内存中的,受硬件问题、断电问题的影响,只能将这些表作为临时表或缓存使用。

特点:

  • 存放在内存中,速度快
  • hash索引(默认)

文件:

  • xxx.sdi: 存储表结构信息

 4.3  存储引擎的区别、特点

MySQL存储引擎_第11张图片

特点 InnoDB MyISAM Memory
存储限制 64TB
事务安全 支持 - -
锁机制 行锁 表锁 表锁
B+tree索引 支持 支持 支持
Hash索引 - - 支持
全文索引 支持(5.6版本之后) 支持 -
空间使用 N/A
内存使用 中等
批量插入速度
支持外键 支持 - -

面试题:InnoDB和MyISAM的区别?(事务、外键、行级锁的区别)

  1. 事务支持:InnoDB是一个支持事务处理的存储引擎,它遵循ACID(原子性、一致性、隔离性和持久性)属性。这使得InnoDB适合处理需要数据完整性和并发控制的应用程序。而MyISAM不支持事务处理。

  2. 锁机制:InnoDB使用行级锁定来提供更好的并发控制,只锁定被修改的行,而不是整个表。这使得多个用户可以同时读取和修改不同的行,从而提高了并发性能。MyISAM使用表级锁定,当一个用户对表进行写操作时,其他用户无法对该表进行读或写操作。

  3. 数据完整性:InnoDB支持外键约束,可以保证数据的完整性,确保关联表之间的数据一致性。MyISAM不支持外键约束,需要在应用程序层面进行手动管理。

  4. 数据缓存:InnoDB通过使用缓冲池(buffer pool)来缓存数据和索引,默认情况下将内存的80%用作缓冲池。这样可以加快数据的读取速度。MyISAM则依赖于操作系统的缓存来管理数据和索引的读取。

  5. 崩溃恢复:InnoDB支持崩溃恢复,具有自动恢复功能,可以在数据库发生故障或断电后保证数据的一致性。MyISAM在崩溃后需要进行手动修复,并且可能会导致数据损坏或丢失。

五、存储引擎的选择

MySQL存储引擎_第12张图片

在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。

  • InnoDB: 如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,则 InnoDB 是比较合适的选择
  • MyISAM: 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那这个存储引擎是非常合适的。
  • Memory: 将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。Memory 的缺陷是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性

电商中的足迹和评论适合使用 MyISAM 引擎,缓存适合使用 Memory 引擎。

目前开发中,MyISAM 引擎通常被MongoDB替代, Memory 引擎通常被Redis替代。

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