连接层:
最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
服务层:
第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。
引擎层:
存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过APl和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。
存储层:
主要是将数据存储在文件系统之上,并完成与存储引擎的交互。
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。
MySQL默认的存储引擎是InnoDB。
--查询建表语句
show create table 表名;
--建表时指定存储引擎
CREATE TABLE 表名(
...
) ENGINE=INNODB;
-- 查看当前数据库支持的存储引擎
show engines;
其中Engine代表引擎,Support代表是否支持。
InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB 是默认的 MySQL 引擎。
特点:
文件:
参数: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 逻辑存储结构:
InnoDB 是一种流行的存储引擎,用于 MySQL 关系型数据库管理系统。它具有以下几个主要的逻辑存储结构:
表空间(Tablespace):
innodb_file_per_table
参数,每个表将拥有自己独立的表空间文件。这些文件位于数据目录中,以表名为基础命名。段(Segment):
区(Extent):
行(Row):
值得注意的是,InnoDB 存储引擎还有其他一些辅助的逻辑结构,如回滚段(Rollback Segment)、撤销日志(Undo Log)等,用于支持事务的 ACID 特性。但这些结构不属于 InnoDB 的主要逻辑存储结构。
这些逻辑存储结构共同工作,使得 InnoDB 存储引擎能够高效地管理和访问数据库表的数据和索引,并提供高性能和可靠的事务处理能力。
MyISAM 是 MySQL 早期的默认存储引擎。
特点:
文件:(以MyISAM为存储引擎建立的表,磁盘中默认有下面三个文件 )
Memory 引擎的表数据是存储在内存中的,受硬件问题、断电问题的影响,只能将这些表作为临时表或缓存使用。
特点:
文件:
特点 | InnoDB | MyISAM | Memory |
---|---|---|---|
存储限制 | 64TB | 有 | 有 |
事务安全 | 支持 | - | - |
锁机制 | 行锁 | 表锁 | 表锁 |
B+tree索引 | 支持 | 支持 | 支持 |
Hash索引 | - | - | 支持 |
全文索引 | 支持(5.6版本之后) | 支持 | - |
空间使用 | 高 | 低 | N/A |
内存使用 | 高 | 低 | 中等 |
批量插入速度 | 低 | 高 | 高 |
支持外键 | 支持 | - | - |
面试题:InnoDB和MyISAM的区别?(事务、外键、行级锁的区别)
事务支持:InnoDB是一个支持事务处理的存储引擎,它遵循ACID(原子性、一致性、隔离性和持久性)属性。这使得InnoDB适合处理需要数据完整性和并发控制的应用程序。而MyISAM不支持事务处理。
锁机制:InnoDB使用行级锁定来提供更好的并发控制,只锁定被修改的行,而不是整个表。这使得多个用户可以同时读取和修改不同的行,从而提高了并发性能。MyISAM使用表级锁定,当一个用户对表进行写操作时,其他用户无法对该表进行读或写操作。
数据完整性:InnoDB支持外键约束,可以保证数据的完整性,确保关联表之间的数据一致性。MyISAM不支持外键约束,需要在应用程序层面进行手动管理。
数据缓存:InnoDB通过使用缓冲池(buffer pool)来缓存数据和索引,默认情况下将内存的80%用作缓冲池。这样可以加快数据的读取速度。MyISAM则依赖于操作系统的缓存来管理数据和索引的读取。
崩溃恢复:InnoDB支持崩溃恢复,具有自动恢复功能,可以在数据库发生故障或断电后保证数据的一致性。MyISAM在崩溃后需要进行手动修复,并且可能会导致数据损坏或丢失。
在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。
电商中的足迹和评论适合使用 MyISAM 引擎,缓存适合使用 Memory 引擎。
目前开发中,MyISAM 引擎通常被MongoDB替代, Memory 引擎通常被Redis替代。