当前位置: 首页 > news >正文

MYSQL8.0版本创建测试表,并搜集统计信息,学习简单的优化

创建测试表

CREATE TABLE `user_info` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_no` varchar(32) NOT NULL COMMENT '用户编号',
  `user_name` varchar(64) NOT NULL COMMENT '用户姓名',
  `age` int NOT NULL DEFAULT '0' COMMENT '年龄',
  `gender` tinyint NOT NULL DEFAULT '0' COMMENT '性别 0-未知 1-男 2-女',
  `phone` varchar(11) NOT NULL COMMENT '手机号',
  `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_no` (`user_no`),
  KEY `idx_age_create_time` (`age`, `create_time`),
  KEY `idx_name_phone` (`user_name`, `phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户信息表';
 
创建测试表order_info
CREATE TABLE`order_info` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT'主键ID',
`order_no`varchar(32) NOT NULL COMMENT'订单编号',
`user_id`bigint unsigned NOT NULL COMMENT'用户ID',
`order_amount`decimal(10,2) NOT NULL COMMENT'订单金额',
`order_status`tinyint NOT NULL DEFAULT'0'COMMENT'订单状态',
`create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT'创建时间',
  PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY`idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='订单表';
 
 
-- 清空旧数据(可选,执行前确认)
TRUNCATE TABLE order_info;
TRUNCATE TABLE user_info;
 

-- 关闭临时校验,提升插入速度
SET SESSION autocommit = 0;
SET SESSION unique_checks = 0;
SET SESSION foreign_key_checks = 0;
 

1. SET SESSION autocommit = 0;

  • 关闭:自动提交模式(默认开启)

  • 作用:每个 SQL 语句不再自动提交,必须显式执行 COMMIT 或 ROLLBACK 才能结束事务。
    可以将多个操作合并为一个事务,提高批量插入/更新的效率,并在出错时整体回滚。

2. SET SESSION unique_checks = 0;

  • 关闭:唯一性约束检查(默认开启)

  • 作用:MySQL 在插入或更新数据时,跳过对唯一索引(如 PRIMARY KEY、UNIQUE 索引)的重复值校验。
    这能显著加快大量数据的导入速度,但可能插入重复的违规数据。通常用于数据导入前关闭,导入后重新开启并清理重复项。

3. SET SESSION foreign_key_checks = 0;

  • 关闭:外键约束检查(默认开启)

  • 作用:MySQL 不再验证表之间的外键关系,允许以任意顺序插入、删除或截断表,即使操作会破坏外键引用完整性。
    常用于数据恢复、跨表重排数据或批量加载时避免外键报错。操作完成后应重新开启并确保数据一致性。

 
创建存储过程
-- 建存储过程插入 1万用户 + 1万订单
DELIMITER //
CREATE PROCEDURE batch_insert_data()
BEGIN
    DECLARE i INT DEFAULT 1;

    -- 插入 user_info 1万条
    WHILE i <= 10000 DO
        INSERT INTO user_info (user_no, user_name, age, gender, phone)
        VALUES (
            CONCAT('USER_', LPAD(i, 8, '0')),
            CONCAT('测试用户', i),
            FLOOR(18 + (RAND() * 40)),
            FLOOR(1 + (RAND() * 2)),
            CONCAT('138', LPAD(FLOOR(RAND() * 100000000), 8, '0'))
        );
        SET i = i + 1;
    END WHILE;

    -- 插入 order_info 1万条
    SET i = 1;
    WHILE i <= 10000 DO
        INSERT INTO order_info (order_no, user_id, order_amount, order_status)
        VALUES (
            CONCAT('ORDER_', LPAD(i, 8, '0')),
            i,
            ROUND(10 + (RAND() * 990), 2),
            FLOOR(1 + (RAND() * 3))
        );
        SET i = i + 1;
    END WHILE;
END ;
DELIMITER ;

-- 执行插入
CALL batch_insert_data();
 
-- 恢复数据库设置
COMMIT;
SET SESSION autocommit = 1;
SET SESSION unique_checks = 1;
SET SESSION foreign_key_checks = 1;

-- 删除存储过程
DROP PROCEDURE IF EXISTS batch_insert_data;
 
SELECT COUNT(*) FROM user_info;   -- 应输出 10000
SELECT COUNT(*) FROM order_info;  -- 应输出 10000
 
查询统计信息

查询 mysql.innodb_table_stats (最准确)

适用场景:查询优化器持久化统计信息的最后更新时间。
MySQL 优化器用于生成执行计划的表级统计信息存储在 mysql.innodb_table_stats 表中,其中的 last_update 字段能最准确地反映统计信息被收集或自动更新的时间。

SELECT * FROM mysql.innodb_table_stats WHERE table_name = 'your_table';

  • 准确性与机制:当表数据发生超过 innodb_stats_auto_recalc 阈值(默认10%的行被修改)时,last_update 会自动更新。也支持手动修改此表以影响执行计划。

  • 高价值列:除了 last_updaten_rows(估算行数)和 clustered_index_size(聚簇索引页数)等对分析表规模很有参考价值。

快速查看表上最后一次数据变更(DML)的大致时间。

SELECT TABLE_NAME, UPDATE_TIME FROM information_schema.tables WHERE table_name = 'your_table';

若怀疑统计信息过时,可执行 ANALYZE TABLE table_name;

 

-- 单表更新

ANALYZE TABLE user_info; ANALYZE TABLE order_info;

-- 一次性更新整个库的所有表(如果需要)

ANALYZE TABLE 你的库名.*;

 

-- 查看表的统计信息最后更新时间

SELECT TABLE_NAME, STATS_VERSION, STATS_AUTO_RECALC, STATS_SAMPLE_PAGES, LAST_UPDATE

FROM information_schema.TABLES

WHERE

TABLE_SCHEMA = '你的库名'

AND TABLE_NAME IN ('user_info','order_info');

 

LAST_UPDATE 是最新时间 = 统计信息已更新

 
MySQL 8.0 默认自动收集,不需要你管,但:
 
  • 大批量插入后 不会立刻触发
  • 所以建议你 手动执行一次 ANALYZE
自动触发条件:
  1. 表数据变化超过 10%
  2. 写入行数达到阈值
  3. 后台定时任务更新
可以一次更新多个表
ANALYZE TABLE user_info, order_info;
 
http://www.jsqmd.com/news/608631/

相关文章:

  • 2026年苏州能寄宿的私立民办学校教育选择解析 - 品牌排行榜
  • 2026年汽车充电桩厂家:从山区到港口的场景化解决方案 - 真知灼见33
  • ADRC线性自抗扰控制感应电机矢量控制调速Matlab Simulink仿真及性能分析
  • 文件(内部/外部)存储
  • 5962-8876802KPC,具备10,000 V/μs 共模瞬态抗扰度的高抗扰度光耦合器
  • 大模型小白入门指南:从零开始掌握AI,高效提升生产力(收藏必备)
  • Exploring the Necessity of Noise Conditioning in Denoising Diffusion Models: A Theoretical and Pract
  • 2026年初效板式过滤器有哪些品牌 - 品牌排行榜
  • FastAPI 2.0流式响应必须立即升级的4项配置——PyPI最新2.0.10已强制校验,旧版部署将在Q3自动降级为同步模式
  • 3种智能提取方案:百度网盘工具效率提升指南
  • 云原生应用开发与部署:构建高效的现代化应用
  • 技术判断力之AI三问涌
  • Qwen3-ASR-0.6B在智能零售中的语音分析应用
  • Python AOT编译不再依赖LLVM:2026插件如何实现纯Python源码→本地机器码直编?下载链接+SHA3-512校验值全公开
  • 金字塔池化模块改进YOLOv26多尺度全局上下文聚合与自适应感受野融合双重突破
  • 对称矩阵对角化与二次型优化:特征值在极值求解中的核心作用
  • 多租户下的系统业务开发过程探讨痛
  • 卡证检测矫正模型API设计规范:RESTful与GraphQL对比
  • 承受700度高温的耐火芯片问世;特斯拉携手英特尔打造AI芯片厂;轻舟智航世界模型助力自动驾驶新车交付
  • 西门子200SMART控制下的30吨双级反渗透+EDI工艺水处理程序案例:自动化与高效稳定性的...
  • 保姆级教程:用PyTorch复现PINN求解Burgers方程(附完整代码与避坑指南)
  • Flutter系列之Dialog宽度自定义实战:突破280dp的默认限制
  • GaussDB /openGauss 与 MySQL、Oracle、PostgreSQL 核心对比表
  • 容器编排与 Kubernetes 实践:构建高效的容器管理系统
  • RePKG技术指南:Wallpaper Engine资源文件解析与转换工具深度解析
  • 别再乱用ref和reactive了!Vue3响应式API实战避坑指南(附代码对比)
  • SecGPT-14B输入过滤:防止OpenClaw执行恶意构造的模型指令
  • VCS增量编译与分离编译的性能优化实践
  • 2026-04-07 GitHub 热点项目精选
  • nVisual预标签技术:提升综合布线效率与准确性的革新方案