SQL 索引优化指南:原理、知识点与实践案例

SQL 索引优化指南:原理、知识点与实践案例

索引的基本原理

索引是数据库中用于加速数据检索的数据结构,类似于书籍的目录。它通过创建额外的数据结构来存储部分数据,使得查询可以快速定位到所需数据而不必扫描整个表。

索引的工作原理

  1. B-Tree/B+Tree索引(最常见):
    • 平衡树结构,保证查询效率稳定
    • 适合范围查询和精确查询
    • InnoDB使用B+Tree,非叶子节点只存键值,叶子节点存储数据
  2. 哈希索引
    • 基于哈希表实现
    • 适合等值查询,O(1)时间复杂度
    • 不支持范围查询
  3. 全文索引
    • 用于文本内容的搜索
    • 支持模糊匹配和关键词搜索

索引优化的关键知识点

1. 索引类型选择

  • 普通索引:最基本的索引,无特殊限制
  • 唯一索引:确保列值唯一
  • 主键索引:特殊的唯一索引,不允许NULL值
  • 复合索引:多列组合的索引
  • 覆盖索引:索引包含查询所需的所有字段

2. 索引创建原则

  • 选择性高的列:区分度高的列(如用户ID)比区分度低的列(如性别)更适合建索引
  • 常用查询条件:WHERE、JOIN、ORDER BY、GROUP BY中的列
  • 避免过度索引:索引会占用空间并降低写入性能
  • 短索引优先:特别是对字符串列,可考虑前缀索引

3. 索引失效的常见场景

  • 使用!=<>操作符
  • 对索引列使用函数或运算:WHERE YEAR(create_time) = 2023
  • 类型不匹配的查询:字符串列用数字查询
  • 使用OR条件(除非所有OR条件都有索引)
  • 模糊查询以通配符开头:LIKE '%abc'
  • 不符合最左前缀原则的复合索引使用

索引优化实践案例

案例1:选择合适的索引列

问题SQL

SELECT * FROM users WHERE age > 20 AND status = 'active' ORDER BY create_time DESC;

优化方案

-- 创建复合索引
ALTER TABLE users ADD INDEX idx_age_status_createtime (age, status, create_time);-- 如果status='active'的数据很少,可以调整顺序
ALTER TABLE users ADD INDEX idx_status_age_createtime (status, age, create_time);

案例2:避免索引失效

问题SQL

SELECT * FROM orders WHERE DATE_FORMAT(create_time, '%Y-%m-%d') = '2023-01-01';

优化方案

下载

-- 改为范围查询,避免对列使用函数
SELECT * FROM orders 
WHERE create_time >= '2023-01-01 00:00:00' 
AND create_time < '2023-01-02 00:00:00';

案例3:利用覆盖索引

问题SQL

SELECT user_id, username FROM users WHERE email = 'user@example.com';

优化方案

-- 创建覆盖索引
ALTER TABLE users ADD INDEX idx_email_username (email, username);-- 查询只需扫描索引,不需回表

案例4:复合索引的最左前缀原则

问题SQL

SELECT * FROM products WHERE category = 'electronics' AND price > 1000;

现有索引INDEX (price, category)

优化方案

-- 调整索引列顺序以匹配查询模式
ALTER TABLE products ADD INDEX idx_category_price (category, price);

高级索引优化技术

  1. 索引下推(ICP):MySQL 5.6+,将WHERE条件推送到存储引擎层过滤
  2. MRR优化:多范围读取,减少随机IO
  3. 索引合并:对多个单列索引的条件进行合并
  4. 自适应哈希索引:InnoDB自动为频繁访问的页创建哈希索引

监控与维护索引

  1. 查看索引使用情况

    SELECT * FROM sys.schema_index_statistics 
    WHERE table_schema = 'your_db' AND table_name = 'your_table';-- 或使用EXPLAIN分析查询
    EXPLAIN SELECT * FROM users WHERE username = 'test';
    
  2. 定期维护索引

    ANALYZE TABLE your_table;  -- 更新索引统计信息
    OPTIMIZE TABLE your_table; -- 重建表,整理碎片
    
  3. 删除无用索引

    DROP INDEX index_name ON table_name;
    

通过合理设计和优化索引,可以显著提高数据库查询性能,但需要平衡查询性能和写入开销,定期监控和调整索引策略是关键

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

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

相关文章

typedef unsigned short uint16_t; typedef unsigned int uint32_t;

你提到的这两行是 C/C 中的类型别名定义&#xff1a; typedef unsigned short uint16_t; typedef unsigned int uint32_t;它们的目的是让代码更具可读性和可移植性&#xff0c;尤其在处理精确位数的整数时非常有用。 ✅ 含义解释 typedef unsigned short uint16_t;…

Hapi.js知识框架

一、Hapi.js 基础 1. 核心概念 企业级Node.js框架&#xff1a;由Walmart团队创建&#xff0c;现由社区维护 配置驱动&#xff1a;强调声明式配置而非中间件 插件架构&#xff1a;高度模块化设计 安全优先&#xff1a;内置安全最佳实践 丰富的生态系统&#xff1a;官方维护…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL金融风控分析之风险指标可视化监控实战一、引言二、案例背景三、数据准备&#xff08;一&#xff09;数据来源与字段说明&#xff08;二&#xff09;数据清洗 四、…

屏幕与触摸调试

本章配套视频介绍: 《28-屏幕与触摸设置》 【鲁班猫】28-屏幕与触摸设置_哔哩哔哩_bilibili LubanCat-RK3588系列板卡都支持mipi屏以及hdmi显示屏的显示。 19.1. 旋转触摸屏 参考文章 触摸校准 参考文章 旋转触摸方向 配置触摸旋转方向 1 2 # 1.查看触摸输入设备 xinput…

AbstractQueuedSynchronizer之AQS

一、前置知识 公平锁和非公平锁&#xff1a; 公平锁&#xff1a;锁被释放以后&#xff0c;先申请的线程先得到锁。性能较差一些&#xff0c;因为公平锁为了保证时间上的绝对顺序&#xff0c;上下文切换更频繁 非公平锁&#xff1a;锁被释放以后&#xff0c;后申…

内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuffer原理

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之八:高通相机CamX内存泄漏&内存占用分析--通用ION(dmabuf)内存拆解 这一篇我们开始讲: 内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuf…

《类和对象(下)》

引言&#xff1a; 书接上回&#xff0c;如果说类和对象&#xff08;上&#xff09;是入门阶段&#xff0c;类和对象&#xff08;中&#xff09;是中间阶段&#xff0c;那么这次的类和对象&#xff08;下&#xff09;就可以当做类和对象的补充及收尾。 一&#xff1a;再探构造…

Java MVC

在软件开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;是一种常用的设计模式&#xff0c;它将应用程序分为三个核心部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。这…

嵌入式学习笔记 - 关于单片机的位数

通常我们经常说一个单片机是8位的&#xff0c;16位的&#xff0c;32位的&#xff0c;那么怎么判断一款单片机的位数是多少位呢&#xff0c;判断的依据是什么呢&#xff0c; 一 单片机的位数 单片机的位数是指单片机数据总线的宽度&#xff0c;也就是一次能处理的数据的位数&a…

推荐几个常用免费的文本转语音工具

推荐几个常用免费的文本转语音工具 在数字内容创作的时代&#xff0c;文本转语音(TTS)技术已经成为内容创作者的得力助手。无论是制作视频配音、有声读物、还是为网站增加语音功能&#xff0c;这些工具都能大幅提高创作效率。今天&#xff0c;我将为大家推荐几款优质的免费文本…

Microsoft Azure DevOps针对Angular项目创建build版本的yaml

Azure DevOps针对Angular项目创建build版本的yaml&#xff0c;并通过变量控制相应job的执行与否。 注意事项&#xff1a;代码前面的空格是通过Tab控制的而不是通过Space控制的。 yaml文件中包含一下内容&#xff1a; 1. 自动触发build 通过指定code branch使提交到此代码库的…

Python Day23 学习

继续SHAP图绘制的学习 1. SHAP特征重要性条形图 特征重要性条形图&#xff08;Feature Importance Bar Plot&#xff09;是 SHAP 提供的一种全局解释工具&#xff0c;用于展示模型中各个特征对预测结果的重要性。以下是详细解释&#xff1a; 图的含义 - 横轴&#xff1a;表示…

.NET 8 + Angular WebSocket 高并发性能优化

.NET 8 Angular WebSocket 高并发性能优化。 .NET 8 WebSocket 高并发性能优化 WebSocket 是一种全双工通信协议&#xff0c;允许客户端和服务端之间保持持久连接。在高并发场景下&#xff0c;优化 WebSocket 的性能至关重要。以下是针对 .NET 8 中 WebSocket 高并发性能优化…

Ubuntu 22.04.5 LTS 基于 kubesphere 安装 cube studio

Ubuntu 22.04.5 LTS 基于 kubesphere 安装 cube studio 前置条件 已经成功安装 kubesphere v4.3.1 参考教程: https://github.com/data-infra/cube-studio/wiki/%E5%9C%A8-kubesphere-%E4%B8%8A%E6%90%AD%E5%BB%BA-cube-studio 1. 安装基础依赖 # ubuntu安装基础依赖 apt insta…

centos 7 安装 java 运行环境

centos 7 安装 java 运行环境 java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)java -version java version "1.8.0_144" Java(TM) …

Linux系统管理与编程20:Apache

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 做好网络和yum配置&#xff0c;用前面dns规划的www的IP进行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …

.NET 在鸿蒙系统上的适配现状

目录 .NET 在鸿蒙系统上的适配现状 鸿蒙系统对虚拟机的限制与.NET的适配挑战 NativeAOT 在鸿蒙系统中的适配原理与实现方式 已知问题与解决方案&#xff1a;鸿蒙系统中的 syscall 限制 鸿蒙系统适配中的技术难点与解决方案 跨平台编译的挑战与应对策略 依赖库管理与兼容…

kotlin JvmName注解的作用和用途

1. JvmName 注解的作用 JvmName 是 Kotlin 提供的一个注解&#xff0c;用于在编译为 Java 字节码时自定义生成的类名或方法名。 作用对象&#xff1a; 文件级别&#xff08;整个 .kt 文件&#xff09;函数、属性、类等成员 主要用途&#xff1a; 控制 Kotlin 编译后生成的 JV…

树莓派4 yolo 11l.pt性能优化后的版本

树莓派4 使用 Picamera2 拍摄图像&#xff0c;然后通过 YOLO11l.pt 进行目标检测&#xff0c;并在实时视频流中显示结果。但当前的代码在运行时可能会比较卡顿&#xff0c;主要原因包括&#xff1a; picam2.capture_array() 是一个较慢的操作&#xff1b;YOLO 推理可能耗时较长…

Docker私有仓库实战:官方registry镜像实战应用

抱歉抱歉&#xff0c;离职后反而更忙了&#xff0c;拖了好久&#xff0c;从4月拖到现在&#xff0c;在学习企业级方案Harbor之前&#xff0c;我们先学习下官方方案registry&#xff0c;话不多说&#xff0c;详情见下文。 注意&#xff1a;下文省略了基本认证 TLS加密&#xff…