第5章:索引和性能优化

第5章:索引和性能优化

5.1 索引基础

5.1.1 什么是索引

  • 索引的定义
  • 索引的工作原理
  • 索引的重要性

5.1.2 索引类型

  • 主键索引
  • 唯一索引
  • 普通索引
  • 全文索引
  • 组合索引

5.1.3 创建和管理索引

  • CREATE INDEX语法
  • ALTER TABLE添加索引
  • 删除索引
  • 索引维护

5.2 性能分析

5.2.1 EXPLAIN分析

  • EXPLAIN基本用法
  • 执行计划解读
  • 关键指标分析

5.2.2 慢查询日志

  • 开启慢查询日志
  • 配置慢查询参数
  • 分析慢查询

5.3 查询优化技巧

5.3.1 索引优化

  • 选择合适的索引
  • 避免索引失效
  • 复合索引最佳实践

5.3.2 SQL语句优化

  • 避免全表扫描
  • 减少子查询
  • 使用JOIN代替子查询
  • 批量操作

5.3.3 表结构优化

  • 字段类型选择
  • 垂直拆分
  • 水平拆分
  • 冷热数据分离

5.4 高级性能优化

5.4.1 缓存策略

  • MySQL查询缓存
  • 第三方缓存方案
  • 缓存穿透和雪崩

5.4.2 硬件优化

  • 磁盘I/O优化
  • 内存配置
  • 服务器选型

代码实践

5.1 索引基础实践

5.1.1 创建测试数据表
-- 创建大数据量测试表
CREATE TABLE performance_test (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50),email VARCHAR(100),age INT,city VARCHAR(50),registration_date DATE
);-- 插入大量测试数据
DELIMITER //
CREATE PROCEDURE insert_test_data()
BEGINDECLARE i INT DEFAULT 0;WHILE i < 1000000 DOINSERT INTO performance_test (username, email, age, city, registration_date) VALUES (CONCAT('user_', i),CONCAT('user_', i, '@example.com'),FLOOR(RAND() * 50 + 18),CASE FLOOR(RAND() * 5)WHEN 0 THEN '北京'WHEN 1 THEN '上海'WHEN 2 THEN '广州'WHEN 3 THEN '深圳'ELSE '杭州'END,DATE_SUB(CURRENT_DATE, INTERVAL FLOOR(RAND() * 3650) DAY));SET i = i + 1;END WHILE;
END //
DELIMITER ;-- 调用存储过程插入数据
CALL insert_test_data();
5.1.2 不同类型索引
-- 普通索引
CREATE INDEX idx_username ON performance_test(username);-- 唯一索引
CREATE UNIQUE INDEX idx_email ON performance_test(email);-- 复合索引
CREATE INDEX idx_age_city ON performance_test(age, city);-- 全文索引(需要FULLTEXT引擎)
CREATE FULLTEXT INDEX idx_fulltext_username ON performance_test(username);

5.2 性能分析实践

5.2.1 EXPLAIN分析查询
-- 未优化查询
EXPLAIN SELECT * FROM performance_test 
WHERE username = 'user_500000';-- 使用索引后的查询
EXPLAIN SELECT * FROM performance_test 
WHERE username = 'user_500000';
5.2.2 慢查询日志分析
-- 配置慢查询日志(需要在MySQL配置文件中设置)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- 记录超过1秒的查询-- 模拟慢查询
SELECT * FROM performance_test 
WHERE age > 30 
ORDER BY registration_date 
LIMIT 10000;

5.3 查询优化技巧

5.3.1 索引优化
-- 不走索引的查询
EXPLAIN SELECT * FROM performance_test 
WHERE YEAR(registration_date) = 2022;-- 优化后的查询
CREATE INDEX idx_registration_date ON performance_test(registration_date);-- 避免在索引列使用函数
EXPLAIN SELECT * FROM performance_test 
WHERE registration_date >= '2022-01-01';
5.3.2 JOIN优化
-- 创建关联表
CREATE TABLE user_orders (order_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT,order_amount DECIMAL(10, 2),order_date DATE
);-- 插入测试数据
INSERT INTO user_orders (user_id, order_amount, order_date)
SELECT id, ROUND(RAND() * 1000, 2), DATE_SUB(CURRENT_DATE, INTERVAL FLOOR(RAND() * 365) DAY)
FROM performance_test
LIMIT 100000;-- 未优化的连接查询
EXPLAIN SELECT pt.username, uo.order_amount 
FROM performance_test pt
JOIN user_orders uo ON pt.id = uo.user_id
WHERE pt.age > 30;-- 添加索引优化
CREATE INDEX idx_user_id ON user_orders(user_id);
CREATE INDEX idx_age ON performance_test(age);
5.3.3 分页优化
-- 传统分页(性能较差)
EXPLAIN SELECT * FROM performance_test 
ORDER BY id 
LIMIT 100000, 20;-- 优化的分页查询
EXPLAIN SELECT * FROM performance_test 
WHERE id > (SELECT id FROM performance_test ORDER BY id LIMIT 100000, 1
) 
ORDER BY id 
LIMIT 20;

5.4 高级性能优化

5.4.1 查询缓存(MySQL 8.0以下)
-- 查看查询缓存状态
SHOW VARIABLES LIKE 'query_cache%';-- 开启查询缓存
SET GLOBAL query_cache_type = 1;
SET GLOBAL query_cache_size = 67108864;  -- 64MB
5.4.2 表结构优化
-- 选择合适的数据类型
CREATE TABLE optimized_table (id INT UNSIGNED PRIMARY KEY,  -- 无符号整数username VARCHAR(50) CHARACTER SET utf8mb4,age TINYINT UNSIGNED,  -- 使用更小的整数类型registration_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502086.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Cesium】三、实现开场动画效果

文章目录 实现效果实现方法实现代码组件化 实现效果 实现方法 Cesium官方提供了Camera的flyTo方法实现了飞向目的地的动画效果。 官方API&#xff1a;传送门 这里只需要用到目的地&#xff08;destination&#xff09;和持续时间&#xff08;duration&#xff09;这两个参数…

【游戏设计原理】47 - 超游戏思维

对于这条原理&#xff0c;我首先想到的是开放世界&#xff0c;或者探索性游戏&#xff0c;这是最能包容各类玩家的游戏类型。这类游戏定义了基本规则&#xff0c;玩家的可操作性很强。就像上图里的沙池一样&#xff0c;里面有滑梯&#xff0c;是规则性比较明确的&#xff0c;而…

DeepSeek v3为何爆火?如何用其集成Milvus搭建RAG?

最近&#xff0c;DeepSeek v3&#xff08;一个MoE模型&#xff0c;拥有671B参数&#xff0c;其中37B参数被激活&#xff09;模型全球爆火。 作为一款能与Claude 3.5 Sonnet&#xff0c;GPT-4o等模型匹敌的开源模型DeepSeek v3不仅将其算法开源&#xff0c;还放出一份扎实的技术…

Kbuild学习知识点

1.Kbuild本质&#xff1a;一个可扩展、可配置的Makefile框架&#xff0c;递归式Makefile&#xff0c;菜单式配置。 2.Kbuild构成&#xff1a; Makefile:顶层目录下的Makefile.config:内核的配置文件arch/S(ARCH)/Makefile:跟平台架构相关的Makefilescripts/Makefile.*:通用编…

C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)

1、本节要实现的内容 我们在前期的教程中,讨论了在即时渲染模式下的光照内容。但在我们后期使用着色器的核心模式下,会经常在着色器中使光照,我们这里就讨论一下着色器光照效果,以及光照贴图效果,同时这里知识会为后期的更多光照效果做一些铺垫。本节我们首先讨论冯氏光照…

后端java开发路由接口并部署服务器(四)

一、安装IntelliJ IDEA&#xff0c;安装包下载 1、官网下载 2、网盘资源 安装包下载完成后进行傻瓜式下一步安装就可以了 打开IntelliJ IDEA&#xff0c;输入网盘资源文件内容 三、汉化处理 插件搜索chinese&#xff0c;就会找到相应的插件安装重启软件即可 四、新建后端j…

一文理解ssh,ssl协议以及应用

在使用基于密钥的认证方式的时候&#xff0c;私钥的位置一定要符合远程服务器规定的位置&#xff0c;否则找不到私钥的位置会导致建立ssh连接失败 SSH 全称是 “Secure Shell”&#xff0c;即安全外壳协议。 它是一种网络协议&#xff0c;用于在不安全的网络中安全地进行远程登…

通往O1开源之路

“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发&#xff0c;深入分析了实现类似OpenAI o1模型性能的路线图&#xff0c;聚焦于策略初始化、奖…

FPGA、STM32、ESP32、RP2040等5大板卡,结合AI,更突出模拟+数字+控制+算法

板卡选择困难症了&#xff1f;如果你也想玩FPGA、STM32、ESP32、RP2040相关的板卡&#xff0c;不如看看以下几款板卡&#xff0c;如果正巧碰上能实现你想要做的项目呢~ 01 小脚丫FPGA STEP BaseBoard V4.0套件 STEP BaseBoard V4.0是第4代小脚丫FPGA扩展底板&#xff08;点击了…

python进阶06:MySQL

课后大总结 Day1 一、数据库命令总结 1.连接数据库 连接数据库进入mysql安装目录打开bin文件夹&#xff0c;输入cmd(此命令后无分号)mysql.exe -u root -ppassword命令后输入密码:root 设置密码set passwordpassword("root123"); 查看所有数据库show databases; …

lec7-路由与路由器

lec7-路由与路由器 1. 路由器硬件 路由器的硬件部分&#xff1a; 断电失去&#xff1a; RAM断电不失去&#xff1a;NVRAM&#xff0c; Flash&#xff0c; ROMinterface也算是一部分 路由器是特殊组件的计算机 console 口进行具体的调试 辅助口&#xff08;Auxiliary&…

HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级

注&#xff1a;本文为 “HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级” 相关文章合辑。 引文图片 csdn 转储异常&#xff0c;重传。 篇 1&#xff1a;Smart-Baby 回复中给出故障现象判断参考 篇 2、篇3 &#xff1a;HP 官方 BIOS 恢复、升级教程 开机黑屏&#xff0c…

代码随想录算法训练营第五十天|图论基础|深度优先搜索理论基础|KM98.所有可达路径|广度优先搜索理论基础

图论基础 1、图的基本概念 二维坐标中&#xff0c;两点可以连成线&#xff0c;多个点连成的线就构成了图。 当然图也可以就一个节点&#xff0c;甚至没有节点&#xff08;空图&#xff09; 2、图的种类 整体上一般分为有向图和无向图&#xff1b; 有向图是指图中边是有方向的…

《Vue3实战教程》40:Vue3安全

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时&#xff0c;它会立刻成为我们最关心的问题&#xff0c;会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞&#xff0c;请发送电子邮件至 securityvuejs.org。…

2025年1月4日蜻蜓q旗舰版st完整开源·包含前后端所有源文件·开源可商用可二开·优雅草科技·优雅草kir|优雅草星星|优雅草银满|优雅草undefined

2025年1月4日蜻蜓q旗舰版st完整开源包含前后端所有源文件开源可商用可二开优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined 产品介绍&#xff1a; 本产品主要贡献者优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined-青史留名&#xff0c;时光如川浪淘…

计算机网络练习题

学习这么多啦&#xff0c;那就简单写几个选择题巩固一下吧&#xff01; 1. 在IPv4分组各字段中&#xff0c;以下最适合携带隐藏信息的是&#xff08;D&#xff09; A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中&#xff0c;数据链路层的主要功能是&#xff08;…

【UE5 C++课程系列笔记】21——弱指针的简单使用

目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中&#xff0c;弱指针&#xff08;TWeakPtr &#xff09;也是一种智能指针类型&#xff0c;主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下&#xff0c;提供一种可…

Spring Boot 的自动配置,以rabbitmq为例,请详细说明

Spring Boot 的自动配置特性能够大大简化集成外部服务和组件的配置过程。以 RabbitMQ 为例&#xff0c;Spring Boot 通过 spring-boot-starter-amqp 提供了自动配置支持&#xff0c;开发者只需在应用中添加相关依赖并配置必要的属性&#xff0c;Spring Boot 会自动配置所需的连…

2025/1/4期末复习 密码学 按老师指点大纲复习

我们都要坚信&#xff0c;道路越是曲折&#xff0c;前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…

Vulnhub靶场(Earth)

项目地址 https://download.vulnhub.com/theplanets/Earth.ova.torrent 搭建靶机 官网下载.ova文件双击vm打开导入 获取靶机IP kail终端输入 arp-scan -l 获取靶机 IP 192.168.131.184 信息收集 端口扫描 sudo nmap -sC -sV -p- 192.168.131.184 可以看到开启22端口&…