煅汾付 发表于 2026-3-2 21:25:03

数据库服务存储引擎

①.数据库服务存储引擎介绍

存储引擎官方网站资料:https://dev.mysql.com/doc/refman/8.4/en/innodb-storage-engine.html1.什么是存储引擎/存储引擎有什么作用

利用存储引擎可以有效管理磁盘和内存硬件,实现数据库服务数据调取和数据存储

1.客户端
包含连接工具信息(命令/工具/程序)

2.服务端
包含连接层:负责实现客户端与服务端建立连接会话(连接线程-show processlist;)
包含服务层:负责处理客户端发送SQL语句请求
        解析器:可以对SQL语句做语义和语法检查(权限验证),生成解析数信息(各种处理SQL语句方案)
        优化器:可以对解析树中的执行方案做出选择(资源消耗低的方案,作为最优方案选择)
        执行器:可以根据最优SQL语句方案进行执行,执行后会得到语句的存储信息

引入数据库包含的引擎层
包含引擎层:可以有效控制管理磁盘或内存,进行数据存储调取(CPU-内存-磁盘/内存)
控制管理磁盘或内存完成数据的存储或调取?
2.存储引擎的类型

show engines;                #                显示存储引擎的类型
mysql> show engines;
+--------------------+---------+------------------------------------------------------
| Engine             | Support | Comment                                             
+--------------------+---------+------------------------------------------------------
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign                  
| MyISAM             | YES   | MyISAM storage engine   
............
............


InnoDB                默认的数据存储引擎(MySQL5.5之后的)
应用场景:适用于读多写多,可以保证数据存储安全性和一致性,如:游戏 金融 银行
应用特点:支持事务(保证数据存储安全性)
                支持行级锁(提高并发处理能力)
                支持MVCC机制(可以实现热备数据,并且备份期间不影响数据库正常存储业务)
                支持外键功能

MyISAM                早期的数据存储引擎(MySQL5.5之前的)
应用场景:适用于读多写少,数据完整性要求不高的场景,如博客,新闻网站等
应用缺陷:不支持事务(无法保证数据存储安全性)
                无法支持行级锁,但可以支持表级锁(改善数据库并发处理能力)
           不支持MVCC多版本并发控制机制(在数据备份时,可以实现不影响业务进行备份数据)
           不支持外键约束功能3.数据库存储引擎的管理操作(了解即可)

#        1.查看默认的存储引擎
mysql> select @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+


#        2.修改默认的存储引擎
永久修改存储引擎
vim /etc/my.cnf

default_storage_engine=存储引擎名称

全局临时修改存储引擎
set global default_storage_engine='myisam';


#        3.针对指定数据表设置存储引擎
可以对数据库存储碎片进行整理(可以提高磁盘应用效率)
数据库碎片整理参考资料:https://cloud.tencent.com/developer/article/1848499
create table 表名 (...) engine='存储引擎';
alter table 表名 engine='存储引擎';数据异常损坏修复方法

数据异常损坏,修复数据方法: 利用表空间文件修复数据(相同版本数据库之间 引擎使用innodb)
修复数据常见方法--利用备份数据修复(备份文件 日志文件 利用表空间文件修复)
步骤一:创建两个数据库实例
实例01 模拟早期使用数据库服务
实例02 模拟数据库服务故障后,重新建立的数据库服务

步骤二:在实例01中模拟创建业务数据
mysql -p666666 -S /tmp/mysql.sock <./t100w_oldboy.sql
mysql> show databases;
+--------------------+
| Database         |
+--------------------+
| oldboy

mysql> show tables;
+------------------+
| Tables_in_oldboy |
+------------------+
| t100w            |


步骤三:保存备份数据表结构信息   
mysql> SHOW CREATE TABLE t100w;

CREATE TABLE `t100w` (
`id` int DEFAULT NULL,
`num` int DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

步骤四:模拟数据库服务故障
mv ibdata1 ibdata11

步骤五:需要进行数据库数据修复
create database oldboy;
-- 在新的实例02中,创建好oldboy数据库
CREATE TABLE `t100w` (
`id` int DEFAULT NULL,
`num` int DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- 在新的实例02中,创建新的表信息

alter table oldboy.t100w discard tablespace;
-- 将指定表空间文件,从物理层面进行删除,但数据库逻辑层面依然存在表信息   

cp -a /data/3306/data/oldboy/t100w.ibd /data/3307/data/oldboy

alter table oldboy.t100w import tablespace;

步骤六:查看验证数据信息是否恢复成功
mysql> select count(*) from t100w;
+----------+
| count(*) |
+----------+
|1000000 |
+----------+
1 row in set (0.12 sec)数据异常损坏,修复数据方法: 利用表空间文件修复数据(相同版本数据库之间 引擎使用innodb)
修复数据常见方法--利用备份数据修复(备份文件 日志文件 利用表空间文件修复)
步骤一:创建两个数据库实例
实例01 模拟早期使用数据库服务
实例02 模拟数据库服务故障后,重新建立的数据库服务

步骤二:在实例01中模拟创建业务数据
mysql -p123456 -S /tmp/mysql80.sock <./t100w_oldboy.sql
mysql> show databases;
+--------------------+
| Database         |
+--------------------+
| oldboy

mysql> show tables;
+------------------+
| Tables_in_oldboy |
+------------------+
| t100w            |


步骤三:保存备份数据表结构信息   
CREATE TABLE `t100w` (
`id` int DEFAULT NULL,
`num` int DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

步骤四:模拟数据库服务故障
mv ibdata1 ibdata11

步骤五:需要进行数据库数据修复
create database oldboy;
-- 在新的实例02中,创建好oldboy数据库
CREATE TABLE `t100w` (
`id` int DEFAULT NULL,
`num` int DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- 在新的实例02中,创建新的表信息

alter table oldboy.t100w discard tablespace;
-- 将指定表空间文件,从物理层面进行删除,但数据库逻辑层面依然存在表信息   

cp -a /data/3306/data/oldboy/t100w.ibd /data/3307/data/oldboy

alter table oldboy.t100w import tablespace;

步骤六:查看验证数据信息是否恢复成功
mysql> select count(*) from t100w;
+----------+
| count(*) |
+----------+
|1000000 |
+----------+
1 row in set (0.12 sec)②.数据库服务索引功能应用

1.什么是数据库索引功能

数据库索引功能类似书籍的目录,可以实现快速检索数据(可以减少磁盘IO资源消耗)2.如何设置创建索引信息

方法一:创建设置主键索引——PRI

使用场景:针对主键约束会创建主键索引,可以实现快速查询整行数据信息

创建索引
create table table_name (....,primary key (column));
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` );

查看索引
desc 表名
-- 查看输出中key信息,确认是否有PRI标识信息即可
show index from stu02\G
-- 可以详细查看表中索引信息
需要关注的输出信息:
Non_unique: 0/1
               0 表示创建的可能是唯一或主键索引
               1 表示创建的是普通或联合和索引
Key_name:   索引名称信息,主键索引名只能是 PRIMARY 其他索引名称可以自定义
            区分索引信息应用情况根据索引名称可以正确删除索引
Cardinality: 索引选择度参考数值,数值越大的列越优选设置为索引信息(列的重复值越少)
Index_type:索引应用结构方式 利用索引检索数据算法应用B+Tree -- 拼音B-Tree -- 笔画

删除索引:
alter table stu01 drop primary key;方法二:创建设置唯一索引——UNI

创建设置唯一索引        UNI

使用场景:
类似与主键索引功能,但不同于主键索引,唯一索引列可以存储空值
利用唯一索引功能,只能调取对应主键列信息,无法直接调取所有行数据信息

创建索引:
create table table_name (......,unique index index_name(column));
create unique index 索引名称 on 表名(列名);
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

查看索引:
desc stu05;                                        #        查看输出中key信息,确认是否有UNI标识信息
show index from 表名;                   #        可以详细查看表中索引信息

删除索引
alter table 表名 drop index 索引名;
drop index 索引名 on 数据表名;方法三:创建设置普通索引

使用场景:
当某个列经常作为条件查询数据时,可以设置为普通索引(列数据可以重复/可以为空)
利用普通索引查询信息时,只能直接获取对应主键信息,不能直接获取整行数据信息

创建索引:
create table table_name (......,index index_name(column));
create index 索引名称 on 表名(列名);
ALTER TABLE 表名 ADD 索引名 (列名);

查看索引:
desc stu05;                                        #        查看输出中key信息,确认是否有MUL标识信息
show index from 表名;                   #        可以详细查看表中索引信息

删除索引:
alter table 表名 drop index 索引名;
drop index 索引名 on 数据表名;方法四:创建设置联合索引

联合索引应用:当进行数据查询时,需要利用多列信息作为条件,查询所需数据,可以多列组合创建索引
select * from 表名 where

联合索引创建和应用原则:最左原则
1)创建索引:将需要创建索引的多列信息中,重复值少的列放在联合索引创建的最左边
2)应用索引:在利用联合索引列查询数据时,最左列一定要作为条件进行应用
--- 可以提高数据库数据查询效率,减少磁盘的IO资源消耗

创建索引:
create table table_name (....,indexindex_name(name,gender,age))
create index 索引名称 on 表名(列名) ;
ALTER TABLE 表名 ADD 索引名 (列名);   

查看索引:
show index from 表名
-- 可以详细查看表中索引信息

删除索引:
alter table 表名 drop index 索引名;
drop index 索引名 on 数据表名;③数据库性能压力测试

3)数据库性能压力测试
mysqlslap --defaults-file=/data/3307/my80.cnf --concurrency=100 --iterations=1 --create-schema='oldboy' --query="select * from oldboy.t100w where k2='VWlm'" engine=innodb --number-of-queries=2000 -uroot -S /tmp/mysql87.sock -verbose


--defaults-file-- 表示加载配置文件信息
--concurrency    -- 表示模拟并发连接数量
--create-schema-- 表示压力测试哪个库中数据
--query          -- 表示指定查询数据请求语句
--number-of-queries-- 表示总的访问数据库请求处理的语句次数100 -- 每个连接向数据库发送20次SQL查询请求
--iterations   -- 表示以上压力测试过程反复进行几回④数据库索引结构介绍

索引算法结构:
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
B(Blance)-TREE
主要包含3层结构:
最上层结构:根节点结构 只有有一个数据页作为根节点
中间层结构:支节点结构(非页节点结构) 可以有多层 可以包含多个数据页
最低层结构:叶节点结构 只有一层 可以有多个数据页
利用结构存储数据情况:
每个页节点中,都会存储索引列数据信息 会存储索引列之外数据列信息
idname   agegender
01xiaoA18   男      -- page 01 xiaoA 18 男page
在根节点数据页中,还会存储关联叶节点支节点数据页指针信息
在支节点数据页中,还会存储关联叶节点支节点数据页指针信息
在页节点数据页中,没有指针信息存储
-- 以上索引结构存在数据查询缺陷
   1)查询不同数据信息,消耗IO资源不均衡
   2)更适合做等值数据查询,不太适合做范围数据查询   

B(Blance)+TREE
主要包含3层结构:
最上层结构:根节点结构 只有有一个数据页作为根节点
中间层结构:支节点结构(非页节点结构) 可以有多层 可以包含多个数据页
最低层结构:叶节点结构 只有一层 可以有多个数据页
利用结构存储数据情况:
每个页节点中,都会存储索引列数据信息 不会所有数据页都存储数据列信息
idname   agegender
01xiaoA18   男      -- page 01 xiaoA 18 男page
在根节点数据页中,只会存储索引列信息,以及关联下层数据页节点的指针信息
在支节点数据页中,只会存储索引列信息,以及关联下层数据页节点的指针信息
在页节点数据页中,会存储索引列信息和对应索引列的数据信息以及横向关联的数据页指针信息
-- 以上存储方式的改进,可以保证查询任何数据信息,消耗IO资源是相同的
-- 利用横向指针可以提高数据范围查询效率
-- 在索引结构中,每个方块代表一个page(数据页-4个block=16k 一个数据页输入输出过程称为1个IO消耗)
-- 有了以上索引算法结构,都是为了在查询数据信息时,可以有效定位数据,减少不必要的IO资源损耗

索引应用结构
聚簇索引结构:
- 数据表创建时,显示的构建了主键信息(pk),主键(pk)就是聚簇索引;
- 数据表创建时,没有显示的构建主键信息时,会将第一个不为空的UK的列做为聚簇索引;
- 数据表创建时,以上条件都不符合时,生成一个6字节的隐藏列作为聚簇索引;

辅助索引结构:
- 辅助索引主要是:主要用于辅助聚簇索引查询的索引,一般按照业务查找条件,建立合理的索引信息,也可以称之为一般索引;
- 辅助索引作用是:主要是将需要查询的列信息可以和聚合索引信息建立有效的关联,从而使数据查询过程更高效,节省IO和CPU消耗
- 辅助索引的存储:调取需要建立的辅助索引列信息,并加上相应主键列的所有信息,存储在特定的数据页中;


课程知识总结:
01 数据库引擎知识介绍
   1)数据库引擎功能作用基于数据库体系结构,利用引擎可以管理内存和磁盘进行数据读取或存储
   2)数据库常用引擎区别innodb/myisam
   3)数据库引擎功能设置设置默认引擎 修改指定表的引擎
   4)实现数据信息修复    独立表空间迁移修复数据操作
02 数据库索引知识介绍
   1)数据库索引功能作用加快数据存储或读取效率 减少磁盘IO消耗
   2)数据库索引应用方法主键索引/唯一索引/普通索引/联合索引(创建/查看/删除)
   3)数据库压力测试方法验证索引创建是否有效 (了解)
   4)数据库索引结构层次算法结构(B-TREE、B+TREE) 应用结构(聚簇索引/辅助索引)
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

襁壮鸢 发表于 2026-3-7 09:07:19

喜欢鼓捣这些软件,现在用得少,谢谢分享!

吟氅 发表于 2026-3-11 20:13:10

感谢分享,下载保存了,貌似很强大
页: [1]
查看完整版本: 数据库服务存储引擎