①.数据库服务存储引擎介绍
- 存储引擎官方网站资料:https://dev.mysql.com/doc/refman/8.4/en/innodb-storage-engine.html
复制代码 1.什么是存储引擎/存储引擎有什么作用
- 利用存储引擎可以有效管理磁盘和内存硬件,实现数据库服务数据调取和数据存储
- 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
- [mysqld]
- 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 (....,index index_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层结构:
- 最上层结构:根节点结构 只有有一个数据页作为根节点
- 中间层结构:支节点结构(非页节点结构) 可以有多层 可以包含多个数据页
- 最低层结构:叶节点结构 只有一层 可以有多个数据页
- 利用结构存储数据情况:
- 每个页节点中,都会存储索引列数据信息 会存储索引列之外数据列信息
- id name age gender
- 01 xiaoA 18 男 -- page 01 xiaoA 18 男 page
- 在根节点数据页中,还会存储关联叶节点支节点数据页指针信息
- 在支节点数据页中,还会存储关联叶节点支节点数据页指针信息
- 在页节点数据页中,没有指针信息存储
- -- 以上索引结构存在数据查询缺陷
- 1)查询不同数据信息,消耗IO资源不均衡
- 2)更适合做等值数据查询,不太适合做范围数据查询
-
- B(Blance)+TREE
- 主要包含3层结构:
- 最上层结构:根节点结构 只有有一个数据页作为根节点
- 中间层结构:支节点结构(非页节点结构) 可以有多层 可以包含多个数据页
- 最低层结构:叶节点结构 只有一层 可以有多个数据页
- 利用结构存储数据情况:
- 每个页节点中,都会存储索引列数据信息 不会所有数据页都存储数据列信息
- id name age gender
- 01 xiaoA 18 男 -- 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) 应用结构(聚簇索引/辅助索引)
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |