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

MySQL 索引原理

一、索引基础概念

1. 索引是什么?
  • 定义:索引是帮助MySQL高效获取数据的有序数据结构,类似书籍的目录。
  • 核心作用:减少磁盘I/O次数,提升查询速度(以空间换时间)。
2. 索引的优缺点
优点缺点
加速查询(WHERE、JOIN、ORDER BY)占用磁盘空间
保证数据唯一性(唯一索引)增删改操作变慢(维护索引)
加速表间连接过多索引增加优化器选择成本

二、索引数据结构

1. B+树(默认结构)
  • 特点

    • 多叉平衡树,层数少(3~4层可存千万级数据)。
    • 叶子节点存储数据(InnoDB存主键值或完整数据行)。
    • 叶子节点通过指针串联,支持范围查询。
  • B+树 vs B树

    对比项B+树B树
    数据存储位置仅叶子节点存数据所有节点均可存数据
    查询稳定性稳定(查询路径长度一致)不稳定
    范围查询高效(叶子节点链表连接)需中序遍历
2. 哈希索引(MEMORY引擎)
  • 特点
    • 基于哈希表,精确查询O(1)时间复杂度。
    • 不支持范围查询和排序,仅适合等值查询。

三、索引类型与使用场景

1. 索引分类
类型说明示例
主键索引唯一标识,不允许NULLPRIMARY KEY (id)
唯一索引列值唯一,允许NULLUNIQUE KEY (email)
普通索引无唯一性约束INDEX idx_name (name)
联合索引多列组合索引INDEX idx_age_name (age,name)
全文索引文本内容分词搜索(InnoDB支持)FULLTEXT (content)
2. 聚簇索引 vs 非聚簇索引
对比项聚簇索引(InnoDB)非聚簇索引(MyISAM)
数据存储索引与数据文件绑定索引与数据文件分离
主键查询直接定位数据行需回表查询(二次查找)
叶子节点内容存储完整数据行存储数据行的物理地址

四、索引优化核心原则

1. 最左前缀原则
  • 定义:联合索引中,查询条件需从最左列开始,且不能跳过中间列。
  • 示例
    索引 (age, name, city)
    • ✅ 有效:WHERE age=20 AND name='Tom'
    • ❌ 无效:WHERE name='Tom' AND city='Beijing'(未使用age)
2. 覆盖索引
  • 定义:查询字段全部在索引中,无需回表查数据文件。
  • 优化效果:减少磁盘I/O,提升性能。
  • 示例
    -- 假设索引为 (age, name)
    SELECT age, name FROM users WHERE age=25;  -- 覆盖索引
    SELECT * FROM users WHERE age=25;          -- 需回表
    
3. 索引失效场景
场景示例解决方案
对索引列运算或函数WHERE YEAR(create_time)=2023避免函数,改用范围查询
隐式类型转换WHERE id = '100'(id为INT)保持类型一致
OR连接非索引列WHERE age=20 OR address='上海'拆分查询或为address加索引
LIKE左模糊匹配WHERE name LIKE '%John%'改用右模糊(John%

五、EXPLAIN执行计划分析

1. 关键字段解读
字段说明优化方向
type访问类型(性能排序):system > const > ref > range > index > ALL尽量达到 range 以上
key实际使用的索引确保命中索引
rows预估扫描行数减少扫描量
Extra额外信息(如 Using index利用覆盖索引
2. 示例分析
EXPLAIN SELECT * FROM users WHERE age=25 ORDER BY name;
  • type=ALLkey=NULL:说明未命中索引,需为 age(age, name) 建索引。

六、面试题

1. 为什么用B+树而不用B树或哈希表?
  • B+树:适合范围查询,减少磁盘I/O(非叶子节点只存键,可容纳更多分支)。
  • 哈希表:仅适合等值查询,无法排序和范围查询。
2. 如何优化慢查询?
  1. 使用 EXPLAIN 分析执行计划。
  2. 为WHERE、JOIN、ORDER BY字段添加索引。
  3. 避免索引失效场景(如函数操作)。
  4. 考虑分库分表或读写分离(数据量过大时)。
3. 什么是回表查询?如何避免?
  • 回表:通过普通索引查到主键后,再通过主键索引查找数据行。
  • 避免:使用覆盖索引(查询字段均在索引中)。
4. 主键为什么要用自增ID?
  • B+树插入效率:自增ID保证新数据顺序插入叶子节点,避免页分裂。
http://www.dtcms.com/a/112192.html

相关文章:

  • Koordinator-NodeInfoCollector
  • 微服务架构: SpringCloud服务注册与发现详解
  • P17_ResNeXt-50
  • Apache Struts2 漏洞(CVE-2017-5638)技术分析
  • 七、重学C++—静态多态(编译期)
  • Web Service技术
  • MySQL vs MSSQL 对比
  • AI——使用numpy
  • Java模板方法模式详解
  • Ansible Playbook 进阶探秘:Handlers、变量、循环及条件判断全解析
  • 【设计模式】原型模式:用“克隆”术让对象创建更灵活
  • 开放最短路径优先 - OSPF【LSA详细】
  • 政安晨【超级AI工作流】—— 基于COZE探索有趣的主题互动问答工作流(同宇宙儿童提问机)
  • AI 数理逻辑基础之统计学基本原理(上)
  • 【3】数据结构的双向链表章
  • 每日一题洛谷P8649 [蓝桥杯 2017 省 B] k 倍区间c++
  • 【嵌入式-stm32电位器控制以及旋转编码器控制LED亮暗】
  • DHCP协议和win server2022无脑配置DHCP
  • 残差神经网络(ResNet)概念解析与用法实例:简洁的图像处理任务
  • 树莓派5使用问题
  • Mysql 使用时的一些规范值
  • Kibana 连接 Elasticsearch(8.11.3)教程
  • Vue组件化开发深度解析:Element UI与Ant Design Vue对比实践
  • WEB安全--提权思路
  • LeetCode 1817 查找用户活跃分钟数
  • Linux下调试器gdb_cgdb使用
  • 中小企业数字化赋能专项行动:Websoft9 开源聚合平台的明确行动计划
  • 蓝桥杯真题———交换瓶子
  • 【嵌入式】——Linux系统调用编程
  • Appium 自动化测试从入门到精通