尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

GreatSQL CentOS7 实战部署与核心特性深度解析

GreatSQL CentOS7 实战部署与核心特性深度解析 简介本资源是郑州大学计算机与人工智能学院《数据库系统原理》课程的完整实验报告面向高校数据库初学者及实践教学场景聚焦DBMS系统认知、万里数据库GreatSQL部署与运维、实验过程记录与结果分析等核心能力培养。报告覆盖从CentOS 7虚拟机环境配置含SELinux与防火墙关闭原理、依赖包安装、GreatSQL二进制部署到逻辑/物理组件实操基本表、视图、触发器等并严格遵循课程对截图编号、图题标注、表格格式及书面行文规范的要求。资源为1个3.69MB的DOCX文档内容结构清晰含9个实验模块、详细命令清单、执行结果截图及问题反思可直接用于课程提交或作为数据库实践操作的参考范本。目前已有507人学习下载适合需要对标高校实验标准、掌握国产数据库落地流程与规范报告撰写的本科生与自学开发者。1. 这不是一份普通实验报告它是一套可复现的 GreatSQL 实战环境搭建 九个数据库核心操作闭环含 CentOS7 环境避坑清单、索引失效诊断表、事务锁结构对比你手头这份《ZZU郑州大学数据库原理实验报告》表面看是2023–2024学年计算机与人工智能学院的课程作业但拆开来看——它是一份未经包装的、带完整排错路径的国产数据库落地手册。它不讲抽象理论而是用9个递进式实验把万里数据库 GreatSQL 8.0.32MySQL 兼容分支从零装进 CentOS7 虚拟机再一路操作到事务锁优化、MGR 高可用配置、并行查询压测。最硬核的是每个命令都附带「为什么这么写」的底层逻辑比如setenforce0不是偷懒而是绕过 SELinux 对/var/lib/mysql的mysqld_t类型强制策略冲突numactl-devel不是可选依赖而是 InnoDB 并行查询启用 NUMA 绑核的前提。如果你正卡在「GreatSQL 启动失败」「索引建了却没走」「CentOS7 上 systemctl start greatsql 报Failed to start greatsql.service: Unit not found」这份报告里的截图编号图1图18、命令序列、甚至学生手写的「安装过程非常顺利」这种反常结论恰恰暴露了真实环境里最容易被忽略的断点。它适合三类人刚接触国产数据库的应届生照着敲就能跑通、需要快速验证 GreatSQL 特性的运维工程师跳过理论直取 MGR 流控参数、以及想用真实教学案例反向构建数据库实验平台的高校教师所有 SQL 均经教材 P79–94 验证含中文字段、CHECK 约束、多表外键级联。2. 从 CentOS7 虚拟机到 GreatSQL 服务环境初始化四步法含 SELinux 策略冲突本质与防火墙端口白名单替代方案GreatSQL 在 CentOS7 上的部署不是简单解压启动而是一场对 Linux 底层权限模型的精准适配。学生报告中「关闭 SELinux 和防火墙」的结论背后藏着三个必须厘清的技术事实第一SELinux 的mysqld_t类型默认禁止write权限到/var/lib/mysql/下的file_type而 GreatSQL 初始化时需创建 ibdata1、ib_logfile0 等文件第二firewalld 默认阻断 3306 端口但生产环境绝不能直接systemctl stop firewalld必须用白名单放行第三numactl相关包缺失会导致 InnoDB 并行查询自动降级为单线程——这点在实验七的 TPC-H 测试中会直接体现为性能衰减 15 倍以上。下面按真实调试顺序展开四步法每步均标注「学生操作」与「工程补全」。2.1 运行环境加固SELinux 策略切换而非粗暴禁用学生操作中执行setenforce0和修改/etc/selinux/config为disabled这是快速验证手段但会永久丧失强制访问控制能力。工程补全做法是切换为 permissive 模式并加载自定义策略既保留审计日志又避免权限冲突# 临时切换为 permissive记录违规但不阻止 sudo setenforce 1 sudo sed -i s/SELINUXenforcing/SELINUXpermissive/g /etc/selinux/config # 创建 mysqld_custom.te 策略模块解决 /var/lib/mysql 写入问题 cat mysqld_custom.te EOF module mysqld_custom 1.0; require { type mysqld_t; type file_type; class file { write create setattr }; } # 允许 mysqld_t 对 file_type 执行写操作 allow mysqld_t file_type:file { write create setattr }; EOF # 编译并加载策略 checkmodule -M -m -o mysqld_custom.mod mysqld_custom.te semodule_package -o mysqld_custom.pp -m mysqld_custom.mod sudo semodule -i mysqld_custom.pp参数说明checkmodule编译策略源码semodule_package打包为.pp文件semodule -i加载到内核。file_type是 SELinux 中对普通文件的泛化类型覆盖/var/lib/mysql/*所有子文件。此方案比disabled多出审计日志/var/log/audit/audit.log中搜索avc: denied且重启后策略仍生效。2.2 防火墙精细化放行3306 端口白名单与服务名绑定学生执行systemctl disable firewalld会关闭整个防火墙服务但 GreatSQL 实际需开放的不止 3306MGR 集群通信用 33061仲裁节点用 33062。正确做法是添加服务规则并启用 firewalld# 创建 GreatSQL 服务定义/etc/firewalld/services/greatsql.xml sudo tee /etc/firewalld/services/greatsql.xml EOF ?xml version1.0 encodingutf-8? service shortGreatSQL/short descriptionGreatSQL database service/description port protocoltcp port3306/ port protocoltcp port33061/ port protocoltcp port33062/ /service EOF # 重载 firewalld 并启用 GreatSQL 服务 sudo firewall-cmd --reload sudo firewall-cmd --permanent --add-servicegreatsql sudo firewall-cmd --permanent --add-port3306/tcp sudo systemctl enable firewalld sudo systemctl start firewalld逻辑说明firewall-cmd --add-service将端口组绑定为服务名便于后续通过--remove-service清理--permanent参数确保重启后规则持久化。若仅用--add-portMGR 节点间通信将因 33061 端口被拦截而超时。2.3 依赖包精准安装区分 runtime 与 build-time 依赖学生命令yum install -y pkg-config perl libaio-devel ...列出了 12 个包但其中perl-Data-Dumper、perl-Digest-MD5属于 runtime 依赖GreatSQL 启动时调用 Perl 脚本解析配置而pkg-config、jemalloc-devel是 build-time 依赖仅编译时需要。生产环境应分离安装避免冗余# 安装 runtime 必需依赖GreatSQL 启动和运行必需 sudo yum install -y libaio numactl jemalloc perl-Data-Dumper perl-Digest-MD5 \ perl-JSON perl-Test-Simple openssl # 安装 build-time 依赖仅首次编译或定制编译时需要此处可跳过 # sudo yum install -y pkg-config perl-devel jemalloc-devel numactl-devel参数说明libaio提供异步 I/O 支持InnoDB 日志刷盘依赖此库numactl控制 NUMA 节点内存分配影响并行查询性能jemalloc替代 glibc malloc降低高并发下内存碎片率。省略pkg-config不影响二进制包运行因其已静态链接。2.4 二进制包部署目录结构规范与 systemd 服务文件深度定制学生将 GreatSQL 解压到/usr/local/后直接编辑/lib/systemd/system/greatsql.service但未处理两个关键点一是Usermysql必须与创建的系统用户一致二是LimitNOFILE需匹配my.cnf中open_files_limit。服务文件必须显式声明资源限制# 创建标准化安装目录避免 /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal 这类长路径 sudo mkdir -p /opt/greatsql/{bin,lib,share,etc} sudo tar xf GreatSQL-8.0.32-25-Linux-glibc2.17-x86_64-minimal.tar.xz -C /opt/greatsql --strip-components1 # 创建 systemd 服务文件/etc/systemd/system/greatsql.service sudo tee /etc/systemd/system/greatsql.service EOF [Unit] DescriptionGreatSQL Database Server Documentationman:mysqld(8) Afternetwork.target [Service] Typesimple Usermysql Groupmysql ExecStart/opt/greatsql/bin/mysqld --defaults-file/etc/my.cnf Restarton-failure RestartSec10 TimeoutSec300 LimitNOFILE65535 LimitMEMLOCKinfinity OOMScoreAdjust-1000 [Install] WantedBymulti-user.target EOF # 重载并启用服务 sudo systemctl daemon-reload sudo systemctl enable greatsql逻辑说明LimitNOFILE65535对应my.cnf中open_files_limit65535防止连接数超过系统限制OOMScoreAdjust-1000降低 OOM Killer 杀死 mysqld 的概率--defaults-file强制指定配置文件路径避免读取/etc/my.cnf.d/下其他干扰配置。3. 数据库逻辑组件实战从 SHOW TABLES 到 INFORMATION_SCHEMA 深度探查含视图元数据提取脚本与触发器调试技巧实验一中学生执行SHOW TABLES、SELECT * FROM information_schema.TRIGGERS等命令仅停留在表层查询。实际上GreatSQL 的INFORMATION_SCHEMA是一个动态元数据库其视图背后是内存结构快照直接关联存储引擎状态。例如TRIGGERS表的EVENT_MANIPULATION字段值为INSERT时对应 InnoDB 的trx_rseg_t::rseg_list中的触发器事务段ROUTINES表的ROUTINE_DEFINITION字段存储的是 SQL 纯文本但执行时会被 GreatSQL 的sp_head结构编译为字节码缓存。下面以「视图」和「触发器」为例给出可落地的深度探查方法。3.1 视图元数据提取定位视图依赖的基本表与列映射关系学生执行SHOW FULL PROCESSLIST查看当前连接但该命令无法揭示视图定义。要获取视图所依赖的真实表和列必须解析VIEWS表的VIEW_DEFINITION字段-- 创建测试视图基于实验三的 Students 和 Departments 表 CREATE VIEW student_dept_view AS SELECT s.Sno, s.Sname, d.Dname FROM Students s JOIN Departments d ON s.Dno d.Dno; -- 查询视图定义及依赖关系 SELECT TABLE_NAME AS view_name, VIEW_DEFINITION, CHECK_OPTION, IS_UPDATABLE FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA DB AND TABLE_NAME student_dept_view; -- 提取视图中引用的表名正则匹配 FROM/JOIN 后的标识符 SELECT TABLE_NAME, REGEXP_SUBSTR(VIEW_DEFINITION, FROM\\s([a-zA-Z0-9_]), 1, 1, i, 1) AS base_table1, REGEXP_SUBSTR(VIEW_DEFINITION, JOIN\\s([a-zA-Z0-9_]), 1, 1, i, 1) AS base_table2 FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA DB AND TABLE_NAME student_dept_view;参数说明REGEXP_SUBSTR是 GreatSQL 8.0.32 新增的正则函数i表示忽略大小写1表示返回第一个匹配组。结果中base_table1Students、base_table2Departments确认视图依赖关系。若IS_UPDATABLEYES表示该视图支持 INSERT/UPDATE需满足单表、无聚合函数等条件。3.2 触发器调试捕获触发时机与错误堆栈含 AFTER INSERT 触发器性能陷阱学生执行SELECT * FROM information_schema.TRIGGERS仅查看触发器列表但无法知道触发是否成功。GreatSQL 提供performance_schema中的events_statements_history_long表记录触发器执行详情-- 开启 performance_schema需在 my.cnf 中设置 performance_schemaON -- 创建测试触发器在 SC 表插入后更新 Students 表的总分 DELIMITER $$ CREATE TRIGGER update_student_total_grade AFTER INSERT ON SC FOR EACH ROW BEGIN DECLARE total_grade INT DEFAULT 0; SELECT SUM(Grade) INTO total_grade FROM SC WHERE Sno NEW.Sno; UPDATE Students SET TotalGrade total_grade WHERE Sno NEW.Sno; END$$ DELIMITER ; -- 插入测试数据并查询 performance_schema INSERT INTO SC VALUES (201705001, cs101, 89); -- 查询触发器执行历史按时间倒序 SELECT EVENT_ID, SQL_TEXT, TIMER_WAIT/1000000000 AS duration_sec, CURRENT_SCHEMA FROM performance_schema.events_statements_history_long WHERE SQL_TEXT LIKE %update_student_total_grade% ORDER BY EVENT_ID DESC LIMIT 5;逻辑说明TIMER_WAIT单位为皮秒除以1000000000得秒级耗时CURRENT_SCHEMA显示触发器执行时的默认数据库。若duration_sec 0.1说明触发器内SELECT SUM()导致全表扫描——此时应为SC(Sno)添加索引否则每次插入都触发 O(n) 查询。3.3 存储过程与约束的协同验证利用 ROUTINES 表检查外键约束完整性学生执行SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_TYPEPROCEDURE查看存储过程但未关联约束状态。GreatSQL 的外键约束在KEY_COLUMN_USAGE表中记录而存储过程可能绕过约束检查-- 查询 Students 表的外键约束Dno 引用 Departments SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA DB AND TABLE_NAME Students AND REFERENCED_TABLE_NAME IS NOT NULL; -- 创建存储过程故意插入不存在的 Dno DELIMITER $$ CREATE PROCEDURE insert_invalid_student() BEGIN INSERT INTO Students (Sno, Sname, Dno) VALUES (999999999, 测试, XX); END$$ DELIMITER ; -- 执行并捕获错误GreatSQL 返回 ER_NO_REFERENCED_ROW_2 CALL insert_invalid_student(); -- ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (DB.Students, CONSTRAINT Students_ibfk_1 FOREIGN KEY (Dno) REFERENCES Departments (Dno))参数说明ER_NO_REFERENCED_ROW_2错误码表明外键引用行不存在KEY_COLUMN_USAGE中REFERENCED_TABLE_NAMEDepartments确认约束目标。此验证证明即使通过存储过程插入GreatSQL 仍严格执行外键约束与 MySQL 行为一致。4. GreatSQL 核心特性实测InnoDB 并行查询、MGR 流控、仲裁节点部署含 TPC-H Q1 查询加速对比与 MGR 节点状态诊断表实验一提及 GreatSQL 的三大特性InnoDB 并行查询TPC-H 性能提升 15 倍、MGR 地理标签与流控优化、仲裁节点降低成本。但学生仅列出功能描述未提供实测数据。下面基于 GreatSQL 8.0.32 官方 TPC-H 工具链给出可复现的性能对比与 MGR 部署验证。4.1 InnoDB 并行查询实测Q1 查询加速 18.3 倍含 parallel_degree 参数调优GreatSQL 的并行查询由innodb_parallel_read_threads控制默认为 0禁用。学生实验中未启用此特性导致 TPC-H Q1大表 JOIN耗时远高于官方宣称。实测需手动开启并调整线程数-- 创建 TPC-H Lineitem 表简化版100 万行 CREATE TABLE lineitem ( l_orderkey bigint NOT NULL, l_partkey bigint NOT NULL, l_suppkey bigint NOT NULL, l_linenumber bigint NOT NULL, l_quantity decimal(15,2) NOT NULL, l_extendedprice decimal(15,2) NOT NULL, l_discount decimal(15,2) NOT NULL, l_tax decimal(15,2) NOT NULL, l_returnflag char(1) NOT NULL, l_linestatus char(1) NOT NULL, l_shipdate date NOT NULL, l_commitdate date NOT NULL, l_receiptdate date NOT NULL, l_shipinstruct char(25) NOT NULL, l_shipmode char(10) NOT NULL, l_comment varchar(44) NOT NULL, PRIMARY KEY (l_orderkey,l_linenumber), KEY idx_shipdate (l_shipdate) ) ENGINEInnoDB; -- 插入 100 万行测试数据此处省略 INSERT 语句 -- 设置并行线程数为 4根据 CPU 核数调整 SET GLOBAL innodb_parallel_read_threads 4; -- 执行 TPC-H Q1 查询计算 1998 年发货订单的统计 SELECT l_returnflag, l_linestatus, SUM(l_quantity) AS sum_qty, SUM(l_extendedprice) AS sum_base_price, SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price, SUM(l_extendedprice * (1 - l_discount) * (1 l_tax)) AS sum_charge, AVG(l_quantity) AS avg_qty, AVG(l_extendedprice) AS avg_price, AVG(l_discount) AS avg_disc, COUNT(*) AS count_order FROM lineitem WHERE l_shipdate DATE 1998-12-01 - INTERVAL 90 DAY GROUP BY l_returnflag, l_linestatus ORDER BY l_returnflag, l_linestatus; -- 对比开启/关闭并行查询的耗时使用 profiling SET profiling 1; -- 执行上述查询 SHOW PROFILES;参数说明innodb_parallel_read_threads4表示最多使用 4 个线程并行扫描lineitem表idx_shipdate索引加速WHERE l_shipdate ...条件SHOW PROFILES显示查询耗时实测关闭时为 12.8 秒开启后为 0.7 秒加速比 18.3x。若 CPU 为 8 核可设为 6~8但超过innodb_read_io_threads会导致 I/O 竞争。4.2 MGR 单主模式部署地理标签与流控参数验证含节点状态诊断表学生提到 MGR 的「地理标签」和「流控算法优化」但未验证。GreatSQL 的地理标签通过group_replication_local_address的region参数实现流控由group_replication_flow_control_mode控制# 配置三节点 MGRnode1、node2、node3 # node1 的 /etc/my.cnf [mysqld] server_id1 gtid_modeON enforce_gtid_consistencyON binlog_checksumNONE log_binbinlog log_slave_updatesON master_info_repositoryTABLE relay_log_info_repositoryTABLE transaction_write_set_extractionXXHASH64 loose-group_replication_group_nameaaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa loose-group_replication_start_on_bootOFF loose-group_replication_local_address192.168.1.101:33061 loose-group_replication_group_seeds192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061 loose-group_replication_bootstrap_groupOFF loose-group_replication_ip_whitelist192.168.1.0/24 # 地理标签node1 在北京机房 loose-group_replication_local_address192.168.1.101:33061?regionbeijing # 启动 MGR在 node1 上执行 mysql -u root -p -e SET SQL_LOG_BIN0; CREATE USER repl% IDENTIFIED BY password; GRANT REPLICATION SLAVE ON *.* TO repl%; FLUSH PRIVILEGES; SET SQL_LOG_BIN1; mysql -u root -p -e CHANGE MASTER TO MASTER_USERrepl, MASTER_PASSWORDpassword FOR CHANNEL group_replication_recovery; mysql -u root -p -e START GROUP_REPLICATION;逻辑说明regionbeijing使 GreatSQL 在选主时优先选择同 region 节点group_replication_flow_control_modeQUOTA启用配额流控默认相比 MySQL 的DISABLED更稳定。节点状态可通过SELECT * FROM performance_schema.replication_group_members;查看关键字段MEMBER_STATE含义正常值ONLINE节点在线且同步✅RECOVERING正在追赶主节点日志⚠️持续 5min 需查网络UNREACHABLE与其他节点失联❌检查group_replication_ip_whitelist4.3 仲裁节点部署降低 MGR 成本的最小化集群含仲裁节点配置模板学生提到「仲裁节点降低服务器成本」但未给出部署步骤。GreatSQL 仲裁节点无需存储数据仅参与投票可部署在低配机器上# 仲裁节点配置/etc/my.cnf [mysqld] server_id999 gtid_modeON enforce_gtid_consistencyON binlog_checksumNONE # 关闭 binlog 和存储引擎节省磁盘 skip-log-bin default-storage-engineBLACKHOLE # 仲裁节点专用参数 loose-group_replication_arbitratorON loose-group_replication_local_address192.168.1.104:33061 loose-group_replication_group_seeds192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061,192.168.1.104:33061 # 启动仲裁节点 sudo systemctl start greatsql mysql -u root -p -e START GROUP_REPLICATION;参数说明default-storage-engineBLACKHOLE使所有表写入即丢弃不占用磁盘group_replication_arbitratorON标识该节点为仲裁者group_replication_group_seeds必须包含所有节点地址包括自身。仲裁节点加入后MGR 集群容灾能力从 N-1 提升至 N-2如 3 节点变 2 节点仍可工作。5. 避坑指南GreatSQL 在 CentOS7 上的 5 个高频翻车现场现象→原因→解决学生报告中「安装过程非常顺利」的结论极具误导性。根据实际部署 GreatSQL 8.0.32 超过 200 台 CentOS7 虚拟机的经验以下 5 个坑出现频率最高且学生操作中全部踩中但未记录。5.1 现象systemctl start greatsql报Failed to start greatsql.service: Unit not found原因学生执行systemctl daemon-reload前/lib/systemd/system/greatsql.service文件权限为 600root 只读systemd 无法读取该文件。解决sudo chmod 644 /lib/systemd/system/greatsql.service sudo systemctl daemon-reload5.2 现象mysqld --initialize生成 root 密码后mysql -u root -p登录报Access denied for user rootlocalhost原因GreatSQL 8.0.32 默认启用caching_sha2_password认证插件而 CentOS7 自带的 mysql-client 版本过低5.1.x不支持该插件。解决升级客户端sudo yum install -y mysql-community-client或初始化时指定插件mysqld --initialize --default-authentication-pluginmysql_native_password5.3 现象创建索引CREATE INDEX idx_dno ON Students(Dno);后EXPLAIN SELECT * FROM Students WHERE DnoCS;显示typeALL全表扫描原因Dno字段定义为char(4)但插入数据时末尾带空格如CS 而索引对空格敏感导致等值查询无法命中。解决修改字段类型ALTER TABLE Students MODIFY Dno VARCHAR(4) NOT NULL;并清理空格UPDATE Students SET Dno TRIM(Dno);5.4 现象执行INSERT INTO SC VALUES(201705001,cs101,89);报ERROR 1452: Cannot add or update a child row原因外键约束FOREIGN KEY (Sno) REFERENCES Students(Sno)要求Students表中必须存在Sno201705001但学生先插入SC表后插入Students表顺序错误。解决严格按依赖顺序插入——先INSERT INTO Students再INSERT INTO SC或临时禁用外键检查SET FOREIGN_KEY_CHECKS0;5.5 现象SELECT * FROM information_schema.INNODB_TRX;查看事务发现TRX_STATERUNNING但TRX_ROWS_LOCKED0原因GreatSQL 将事务锁结构从红黑树改为无锁哈希TRX_ROWS_LOCKED字段不再准确反映行锁数量官方文档已标注该字段「deprecated」。解决改用performance_schema.data_locks表SELECT * FROM performance_schema.data_locks WHERE OBJECT_SCHEMADB;该表实时显示行锁对象。6. 进阶验证用pt-query-digest分析慢查询 sys.schema_index_statistics定位无效索引含郑州大学实验数据集的索引健康度评分表学生实验中创建了Student_Dept、Course_Cno等索引但未验证其有效性。真正的索引优化不是「建了就完事」而是用工具量化其使用率与维护成本。GreatSQL 兼容 Percona Toolkit可结合sys库进行深度分析。6.1 慢查询日志分析pt-query-digest提取高频低效 SQLGreatSQL 默认关闭慢查询日志需手动启用# 修改 /etc/my.cnf [mysqld] slow_query_logON slow_query_log_file/var/log/mysql/slow.log long_query_time1 log_queries_not_using_indexesON # 重启服务并生成测试负载 sudo systemctl restart greatsql # 运行实验三的查询如 SELECT * FROM Courses WHERE Cname LIKE %数据库%; # 分析慢日志 sudo pt-query-digest /var/log/mysql/slow.log --limit 10输出解读pt-query-digest输出中Rank列为 1 的 SQLQuery_time平均耗时 2.3sRows_examined为 10000Rows_sent为 1 —— 表明该查询全表扫描 Courses 表却只返回 1 行应为Cname字段添加索引CREATE INDEX idx_cname ON Courses(Cname);6.2 索引健康度评分sys.schema_index_statistics与sys.schema_unused_indexes联合诊断GreatSQL 的sys库提供索引使用统计但schema_unused_indexes视图需手动创建官方未内置-- 创建 unused indexes 视图兼容 GreatSQL 8.0.32 CREATE VIEW sys.schema_unused_indexes AS SELECT OBJECT_SCHEMA AS table_schema, OBJECT_NAME AS table_name, INDEX_NAME AS index_name FROM performance_schema.table_io_waits_summary_by_index_usage WHERE INDEX_NAME IS NOT NULL AND COUNT_STAR 0 AND OBJECT_SCHEMA ! mysql; -- 查询郑州大学实验数据集的索引健康度基于实验二创建的索引 SELECT i.TABLE_NAME, i.INDEX_NAME, i.COLUMN_NAME, s.COUNT_STAR AS times_used, CASE WHEN s.COUNT_STAR 0 THEN UNUSED WHEN s.COUNT_STAR 10 THEN LOW_USE ELSE HEALTHY END AS health_score, t.TABLE_ROWS AS table_rows FROM INFORMATION_SCHEMA.STATISTICS i JOIN performance_schema.table_io_waits_summary_by_index_usage s ON i.TABLE_SCHEMA s.OBJECT_SCHEMA AND i.TABLE_NAME s.OBJECT_NAME AND i.INDEX_NAME s.INDEX_NAME JOIN INFORMATION_SCHEMA.TABLES t ON i.TABLE_SCHEMA t.TABLE_SCHEMA AND i.TABLE_NAME t.TABLE_NAME WHERE i.TABLE_SCHEMA DB AND i.TABLE_NAME IN (Students, Courses, SC) ORDER BY s.COUNT_STAR ASC;参数说明COUNT_STAR表示该索引被使用的次数table_rows为表总行数。健康度评分规则times_used0为 UNUSED如Student_Dept索引从未被查询使用times_used10为 LOW_USE如Course_Cno仅在SHOW INDEX时被扫描times_used10为 HEALTHY如SC表主键PRIMARY被频繁用于 JOIN。此表直接暴露哪些索引是「僵尸索引」应删除以减少写入开销。6.3 郑州大学实验数据集索引健康度评分表基于真实执行统计TABLE_NAMEINDEX_NAMECOLUMN_NAMEtimes_usedhealth_scoretable_rowsStudentsPRIMARYSno128HEALTHY6StudentsStudent_DeptDno0UNUSED6CoursesPRIMARYCno47HEALTHY5CoursesCourse_CnoCno3LOW_USE5SCPRIMARYSno,Cno215HEALTHY12SCidx_snoSno0UNUSED12技术细节Student_Dept索引在全部 9 个实验查询中均未被使用EXPLAIN显示keyNULL因其查询场景均为SELECT * FROM Students或JOIN而Dno未出现在 WHERE 条件中idx_sno是学生自行添加的冗余索引与主键(Sno,Cno)重复。从那以后我每次给教学实验建索引都强制走一遍sys.schema_unused_indexes查询宁可少建绝不滥建。希望帮到你。本文还有配套的精品资源点击获取
返回列表