MySQL索引:数据库的「超级目录」

想象你有一本1000页的百科全书,要快速找到某个知识点(如“光合作用”):

  • 无索引:逐页翻找 → 全表扫描(慢!)
  • 有索引:直接查目录 → 精准定位(快!)

索引的本质:预先对数据排序+存储位置信息,加速检索的特殊数据结构。


一、索引类型及原理

1. 数据结构
索引类型数据结构适用场景特点
B+树索引多叉平衡树默认索引(InnoDB)范围查询快,适合磁盘存储
哈希索引哈希表精确匹配(Memory引擎)等值查询极快,不支持范围查询
全文索引倒排索引文本搜索(MATCH AGAINST解决LIKE '%word%'低效问题

📌 B+树为什么快?

  • 叶子节点形成链表 → 范围查询高效(如WHERE id > 100
  • 非叶子节点只存索引 → 单节点存储更多key
  • 所有数据在叶子节点 → 查询路径长度一致
2. 逻辑分类
索引类型描述示例
主键索引唯一标识,不允许NULLPRIMARY KEY (id)
唯一索引保证列值唯一,允许NULLUNIQUE KEY (email)
普通索引加速查询,允许重复值INDEX (name)
联合索引多列组合索引INDEX (city, age)

二、索引生效与失效场景

生效场景
-- 1. 全值匹配  
SELECT * FROM users WHERE name = 'Alice';  -- 2. 最左前缀原则(联合索引)  
INDEX (a, b, c)  -- 生效: WHERE a=? / WHERE a=? AND b=? / WHERE a=? AND b=? AND c=?  -- 3. 范围查询(部分生效)  
SELECT * FROM orders WHERE amount > 100 AND status = 1;  -- (amount)索引生效  -- 4. 覆盖索引(直接从索引拿数据)  
SELECT id FROM products WHERE price > 50;  -- 索引包含(id,price)  
失效场景
-- 1. 违反最左前缀  
INDEX (a, b, c)  
WHERE b = 2;     -- ❌ 索引失效  -- 2. 对索引列运算  
WHERE YEAR(create_time) = 2023;  -- ❌ 改用: create_time BETWEEN '2023-01-01' AND '2023-12-31'  -- 3. 隐式类型转换  
WHERE phone = 13800138000;  -- ❌ phone是varchar类型  -- 4. LIKE左模糊  
WHERE name LIKE '%Lee';     -- ❌ 全表扫描  -- 5. OR条件未全覆盖  
WHERE age = 18 OR name = 'Bob';  -- 若name无索引 → 全表扫描  

三、索引优化策略

1. EXPLAIN诊断工具
EXPLAIN SELECT * FROM employees WHERE department_id = 3;  

关键指标:

  • typesystem > const > ref > range > index > ALL(性能从优到差)
  • key:实际使用的索引
  • rows:扫描行数(越小越好)
2. 设计原则
策略说明
只为高频查询建索引避免维护成本(增删改变慢)
短字段优先整型索引比字符串快,考虑用city_code代替city_name
避免冗余索引INDEX(a,b)INDEX(a) 同时存在 → 后者冗余
前缀索引长文本可截取前N字符:ALTER TABLE t ADD INDEX (text_col(10))
3. 慢查询优化示例

问题SQL

SELECT * FROM logs WHERE user_id = 1001 AND DATE(create_time) = '2023-10-01';  

优化步骤

  1. 避免对create_time计算 → 改用范围查询
  2. 建立联合索引(user_id, create_time)
-- 优化后  
SELECT * FROM logs  
WHERE user_id = 1001  AND create_time >= '2023-10-01 00:00:00'  AND create_time < '2023-10-02 00:00:00';  

四、索引的代价

  • 空间代价:索引占用额外存储(特别是B+树的非叶子节点)
  • 时间代价
    • INSERT:需更新索引 → 性能下降约10%
    • UPDATE:若修改索引列 → 触发索引重组
    • DELETE:标记删除 → 产生索引碎片

💡 黄金法则
不要为小表建索引(全表扫描更快)
中大型表重点优化WHERE和JOIN列


五、高级技巧

1. 索引下推(ICP)

MySQL 5.6+

INDEX (age, city)  
SELECT * FROM users WHERE age > 20 AND city = 'Beijing';  
  • 旧版本:先按age>20回表查数据 → 再过滤city
  • 开启ICP:在索引层直接过滤city减少回表次数
2. 覆盖索引优化
-- 原始查询  
SELECT id, name FROM products WHERE category = 'Electronics';  -- 优化方案:  
ALTER TABLE products ADD INDEX (category, id, name);  -- 覆盖索引  

数据直接从索引返回 → 避免回表查主键


总结:索引使用指南

  1. 建索引前问3个问题

    • 数据量是否足够大?
    • 查询频率是否高?
    • 该字段过滤性是否好?(如性别字段不适合单独建索引)
  2. 优先考虑

    • WHERE条件列、JOIN关联列、ORDER BY排序列
  3. 定期维护

    ANALYZE TABLE users;       -- 更新索引统计信息  
    OPTIMIZE TABLE orders;     -- 重建表+索引(解决碎片问题)  
    

🚨 最后警告
索引不是越多越好

  • 表数据量<1万 → 通常不需要索引
  • 每增加一个索引 → INSERT速度降低约10%

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

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

相关文章

景观桥 涵洞 城门等遮挡物对汽车安全性的影响数学建模和计算方法,需要收集那些数据

对高速公路景观桥影响行车视距的安全问题进行数学建模&#xff0c;需要将物理几何、动力学、概率统计和交通流理论结合起来。以下是分步骤的建模思路和关键模型&#xff1a;一、 核心建模目标 量化视距&#xff08;Sight Distance, SD&#xff09;&#xff1a;计算实际可用视距…

Git 用户名和邮箱配置指南:全局与项目级设置

查看全局配置 git config --global user.name # 查看全局name配置 git config --global user.email # 查看全局email配置 git config --global --list # 查看所有全局配置查看当前项目配置 git config user.name # 查看当前项目name配置 git config user.email # 查看当前项目…

视频序列和射频信号多模态融合算法Fusion-Vital解读

视频序列和射频信号多模态融合算法Fusion-Vital解读概述模型整体流程视频帧时间差分归一化TSM模块视频序列特征融合模块跨模态特征融合模块概述 最近看了Fusion-Vital的视频-射频&#xff08;RGB-RF&#xff09;融合Transformer模型。记录一下&#xff0c;对于实际项目中的多模…

frp内网穿透下创建FTP(解决FTP“服务器回应不可路由的地址。使用服务器地址替代”错误)

使用宝塔面板&#xff0c;点击FTP&#xff0c;下载Pure-FTPd插件 点击Pure-FTPd插件&#xff0c;修改配置文件&#xff0c;找到PassivePortRange, 修改ftp被动端口范围为39000 39003&#xff0c;我们只需要4个被动端口即可&#xff0c;多了不好在内网穿透frp的配置文件中增加…

STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)

1.前期硬件准备 2s锂电池一个&#xff08;用于供电&#xff09;&#xff0c;stm32f103c8t6最小系统板一个&#xff08;主控板&#xff09;&#xff0c;两个摇杆&#xff08;用于摇杆模式&#xff09;&#xff0c;四个电位器&#xff08;用于示教器模式&#xff09;&#xff0c…

华为OD机试_2025 B卷_最差产品奖(Python,100分)(附详细解题思路)

题目描述 A公司准备对他下面的N个产品评选最差奖&#xff0c; 评选的方式是首先对每个产品进行评分&#xff0c;然后根据评分区间计算相邻几个产品中最差的产品。 评选的标准是依次找到从当前产品开始前M个产品中最差的产品&#xff0c;请给出最差产品的评分序列。 输入描述 第…

飞算JavaAI:重塑Java开发效率的智能引擎

飞算JavaAI:重塑Java开发效率的智能引擎 一、飞算JavaAI核心价值 飞算JavaAI是全球首款专注Java语言的智能开发助手,由飞算数智科技(深圳)有限公司研发。它通过AI大模型技术实现: 全流程自动化:从需求分析→软件设计→代码生成一气呵成工程级代码输出:生成包含配置类、…

Java和Go各方面对比:现代编程语言的深度分析

Java和Go各方面对比&#xff1a;现代编程语言的深度分析 引言 在当今的软件开发领域&#xff0c;选择合适的编程语言对项目的成功至关重要。Java作为一门成熟的面向对象语言&#xff0c;已经在企业级开发中占据主导地位超过25年。而Go&#xff08;Golang&#xff09;作为Google…

CloudCanal:一款企业级实时数据同步、迁移工具

CloudCanal 是一款可视化的数据同步、迁移工具&#xff0c;可以帮助企业构建高质量数据管道&#xff0c;具备实时高效、精确互联、稳定可拓展、一站式、混合部署、复杂数据转换等优点。 应用场景 CloudCanal 可以帮助企业实现以下数据应用场景&#xff1a; 数据同步&#xff…

如何发现 Redis 中的 BigKey?

如何发现 Redis 中的 BigKey&#xff1f; Redis 因其出色的性能&#xff0c;常被用作缓存、消息队列和会话存储。然而&#xff0c;在 Redis 的使用过程中&#xff0c;BigKey 是一个不容忽视的问题。BigKey 指的是存储了大量数据或包含大量成员的键。它们不仅会占用大量内存&…

Golang读取ZIP压缩包并显示Gin静态html网站

Golang读取ZIP压缩包并显示Gin静态html网站Golang读取ZIP压缩包并显示Gin静态html网站1. 读取ZIP压缩包2. 解压并保存静态文件3. 设置Gin静态文件服务基本静态文件服务使用StaticFS更精细控制单个静态文件服务4. 完整实现示例5. 高级优化内存映射优化使用Gin-Static中间件6. 部…

参数列表分类法:基本参数与扩展参数的设计模式

摘要 本文提出了我设计的一种新的函数参数设计范式——参数列表分类法&#xff0c;将传统的"单一参数列表"扩展为"多参数列表协同"模式。通过引入"基本参数列表"和"扩展参数列表"的概念&#xff0c;为复杂对象构建提供了更灵活、更具表…

Ajax之核心语法详解

Ajax之核心语法详解一、Ajax的核心原理与优势1.1 什么是Ajax&#xff1f;1.2 Ajax的优势二、XMLHttpRequest&#xff1a;Ajax的核心对象2.1 XHR的基本使用流程2.2 核心属性与事件解析2.2.1 readyState&#xff1a;请求状态2.2.2 status&#xff1a;HTTP状态码2.2.3 响应数据属性…

ArcGIS 打开 nc 降雨量文件

1. 打开ArcToolbox&#xff0c;依次打开 多维工具 → 创建 NetCDF 栅格图层&#xff0c;将 nc 文件拖入 输入 NetCDF 文件输入框&#xff0c;确认 X维度&#xff08;经度&#xff09;、Y维度&#xff08;经度&#xff09; 的变量名是否正确&#xff0c;点击 确定。图 1 加载nc文…

01-elasticsearch-搭个简单的window服务-ik分词器-简单使用

1、elasticsearch下载地址 如果是其他版本可以尝试修改链接中的版本信息下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-windows-x86_64.zip 2、ik分词器下载地址 ik分词器下载的所有版本地址&#xff1a;Index of: analysis-ik/stable/…

[数据结构与算法] 优先队列 | 最小堆 C++

下面是关于 C 中 std::priority_queue 的详细说明&#xff0c;包括初始化、用法和常见的应用场景。什么是 priority_queue&#xff1f; priority_queue&#xff08;优先队列&#xff09;是 C 标准库中的一个容器适配器。它和普通队列&#xff08;queue&#xff09;最大的不同在…

零基础入门物联网-远程门禁开关:硬件介绍

一、成品展示 远程门禁最终效果 二、项目介绍 整个项目主要是实际使用案例为主&#xff0c;根据自己日常生活中用到物联网作品为原型&#xff0c;通过项目实例快速理解。项目分为两部分&#xff1a;制作体验和深入学习。 制作体验部分 会提供所有项目资料及制作说明文档&a…

软件系统国产化改造开发层面,达梦(DM)数据库改造问题记录

本系统前&#xff08;vue&#xff09;后端(java spring boot)为列子&#xff0c;数据库由MySQL--->DM&#xff08;达梦&#xff09;&#xff0c;中间件为中创的国产化相关软件&#xff0c;如tomcat、nginx、redis等。重点讲数据库及代码端的更改&#xff0c;中间件在服务端以…

N8N与Dify:自动化与AI的完美搭配

“N8N”和“Dify”这两个工具彻底理清楚&#xff0c;它们其实是两个定位完全不同的开源平台&#xff0c;各自擅长解决不同类型的问题&#xff0c;但也能协同工作。以下是详细说明&#xff1a;1. n8n&#xff1a;工作流自动化平台定位&#xff1a;n8n 是一个专注于跨系统连接与任…

ARM汇编编程(AArch64架构)课程 - 第5章函数调用规范

目录AAPCS64调用约定参数传递规则返回值规则栈帧管理SP寄存器FP寄存器 (X29)栈帧布局示例AAPCS64调用约定 ARM Architecture Procedure Call Standard for 64-bit (AAPCS64) 参数传递规则 参数位置寄存器分配特殊规则参数1-8X0-X7 (64-bit) / W0-W7 (32-bit)浮点数使用 V0-V7参…