存储引擎
MYSQL体系结构
MySQL的体系结构主要由以下几个层次组成:
1)连接层
连接层是MySQL的第一层,负责与MySQL客户端之间的通信,提供如连接处理、身份验证等基本服务。
在这一层,MySQL还引入了线程池的概念,为通过认证安全接入的客户端提供线程。
同样在这一层,也可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
2)服务层
服务层是MySQL的第二层,主要完成大部分的核心服务功能,包括查询解析、分析、优化、缓存、以及所有的内置函数,所有跨存储引擎的功能也在这一层实现,包括触发器、存储过程、视图等。
在这一层,MySQL会对用户传递的SQL语句进行解析,生成语法树,并进行语义解析,同时还会验证客户端是否具有执行该语句的权限。创建好语法树后,MySQL还会对SQL查询进行语法上的优化,进行查询重写。
3)引擎层
引擎层是MySQL的第三层,也是真正与磁盘进行交互,对数据进行存储和读取的部分。
服务器通过API与存储引擎进行通信。
不同的存储引擎具有的功能不同,这样我们就可以根据自己的实际需要进行选取。
例如,InnoDB存储引擎提供了事务处理、外键约束等功能,而MyISAM存储引擎则提供了全文索引、静态表等功能。
4)存储层
存储层是MySQL的第四层,主要是将数据存储在运行于该设备的文件系统之上,并完成与存储引擎的交互。
在这一层,MySQL会将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
存储引擎
-
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。
-
存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定选择的存储引擎,如果没有指定将自动选择默认的存储引擎
1)建表时指定存储引擎
在MySQL中,你可以通过CREATE TABLE
语句创建一个新的数据表,并在创建过程中指定存储引擎。具体的语法格式如下:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
) ENGINE = storage_engine;
在这里,table_name
是你想要创建的新表的名字,column1 datatype
定义了表的列,datatype
是对应列的数据类型,storage_engine
则是你希望使用的存储引擎。
例如,如果你想创建一个名为employee
的表,其中包含id
、name
和age
三个列,并且你想使用InnoDB存储引擎,你可以这样做:
CREATE TABLE employee (
id INT,
name VARCHAR(255),
age INT
) ENGINE = InnoDB;
在这个例子中,id
是整数类型,name
是最大长度为255的字符串类型,age
也是整数类型。这些列都使用了InnoDB存储引擎。
2)查询当前数据库支持的存储引擎
show engines ;
3)修改表的存储引擎
如果你想改变已有的表的存储引擎,你可以使用ALTER TABLE
语句。例如,如果你想将employee
表的存储引擎改为MyISAM,你可以这样做:
ALTER TABLE employee ENGINE = MyISAM;
请注意,这种更改只会影响新插入的数据,已经存在的数据仍会按照原来的存储引擎进行处理。
常用的存储引擎
InnnDB
InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的MySQL 存储引擎。
特点
1事务处理
InnoDB支持事务处理,这意味着你可以同时执行多个操作,而且这些操作要么全部成功,要么全部失败。如果其中一个操作失败,那么其他的操作也会被回滚。
2行级锁定,也支持表锁
InnoDB支持行级锁定,这意味着在并发环境中,只有正在执行的操作会影响到的行才会被锁定,其他行仍然可以被其他事务访问。
3外键约束
InnoDB支持外键约束,这意味着你可以确保数据的一致性。例如,如果你在一个表中定义了一个外键,那么在另一个表中必须有一个对应的值。
4文件
xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件
逻辑表结构
InnoDB存储引擎的逻辑存储结构主要包括以下几个层次:表空间(Tablespace)、段(Segment)、区(Extent)、页(Page)和行(Row)。
表空间(Tablespace)
表空间是InnoDB逻辑结构的最高层,所有的数据都放在表空间中。
在默认情况下,InnoDB存储引擎都有一个共享表空间ibdata1,即所有数据都存放在这个表空间内。如果用户启用了参数innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内。
段(Segment)
表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等。
InnoDB存储引擎表是索引组织(index organized)的,因此数据即索引,索引即数据。那么数据段即为B+树的叶子节点(Leaf node segment),索引段即为B+树的非索引节点(Non-leaf node segment)。
区(Extent)
区是由连续页组成的空间,在任何情况下每个区的大小都为1MB。
为了保证区中页的连续性,InnoDB存储引擎一次从磁盘申请4-5个区。在默认情况下,InnoDB存储引擎的页的大小为16KB,即一个区中应有64个连续的页。
页(Page)
页是InnoDB存储引擎磁盘管理的最小单位,默认16kb,可以通过参数innodb_page_size设置页大小为4K、8K、16K。
行(Row)
行是InnoDB存储引擎中最小的数据单元,一行通常包含了一列或多列的数据。
MYISAM
MyISAM是MySQL早期的默认存储引擎。
特点
1不支持事务
不能同时执行多个操作
2 支持表级锁定,不支持行锁
在对表进行任何操作时,其他对表的访问都会被阻塞。
这可能导致并发性能较低,但对于读操作密集的场景,这种锁定方式可以提高性能。
3 B+树索引
MyISAM使用B+树索引,提供了快速的查询性能。
4 文件
xxx.sdi:存储表结构信息
xxx.MYD: 存储数据
xxx.MYI: 存储索引
总的来说,MyISAM是一个简单易用的存储引擎,适合于一些不需要事务处理和高并发性能的应用场景。
Memory
1). 介绍
Memory引擎的表数据时存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为
临时表或缓存使用。
2). 特点
内存存放
hash索引(默认)
3).文件
xxx.sdi:存储表结构信息
选择
InnoDB
- 如果你需要事务处理:InnoDB是首选,因为它支持事务处理,并且提供了行级锁定机制,这使得它在并发环境下的性能表现优秀。
- 如果你的应用程序需要高可用性:InnoDB提供了自动故障恢复和多版本并发控制(MVCC),这使得它在处理大型、关键业务系统时更加可靠。
- 如果你的表经常需要修改或者更新:InnoDB更适合,因为它支持事务处理,可以确保数据的一致性。
MyISAM
- 如果你的应用程序主要是读取数据:MyISAM可能是一个更好的选择,因为它不支持事务处理,所以在写入数据时会更快。
- 如果你的应用程序不需要事务处理:MyISAM也是一个不错的选择,因为它不支持事务处理,所以它的设计更加简单,运行起来也更高效。
Memory
- 如果你的应用程序需要快速访问数据:Memory可能是最好的选择,因为它把所有的数据都存储在内存中,所以数据访问的速度非常快。
- 如果你的应用程序需要临时存储数据:Memory也是一个很好的选择,因为当MySQL服务重新启动时,Memory存储引擎中的数据不会丢失。