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

第一章:MySQL 索引基础

第一章:MySQL 索引基础

1. 索引是什么?

  • ​定义​​:索引(Index)是数据库中用于快速查找数据的一种数据结构,类似于书籍的目录。
  • ​核心作用​​:通过减少磁盘I/O次数,加速查询速度(尤其是WHEREJOINORDER BY等操作)。
  • ​代价​​:
    • ​存储空间​​:索引需要额外的磁盘或内存空间。
    • ​维护成本​​:增删改操作(INSERT/UPDATE/DELETE)需要同步更新索引,可能降低写性能。

2. 为什么需要索引?

没有索引时的问题

  • ​全表扫描​​(Full Table Scan):查询时必须逐行检查数据,时间复杂度为O(n),数据量大时性能极差。

索引的优化场景

  • 快速定位符合条件的行。
  • 加速表连接(JOIN)操作。
  • 避免排序操作(如果索引本身有序)。

3. MySQL常见索引类型

3.1 按数据结构分类

索引类型数据结构支持引擎适用场景
​B-Tree​平衡多路搜索树InnoDB、MyISAM范围查询、精确查询、排序
​Hash​哈希表Memory/Heap等值查询(仅精确匹配)
​Full-Text​倒排索引InnoDB、MyISAM文本内容的模糊搜索
​R-Tree​空间索引MyISAM地理空间数据查询
B-Tree索引的特点
  • ​默认索引类型​​:InnoDB实际使用B+Tree(B-Tree的变种)。
  • ​有序性​​:索引按顺序存储,适合范围查询(如WHERE age BETWEEN 20 AND 30)。
Hash索引的局限性
  • ​仅支持等值查询​​(=IN()),无法用于范围查询或排序。
  • ​不保证顺序​​:数据存储无序。

3.2 按功能逻辑分类

索引类型描述
​主键索引​唯一且非空,一张表只能有一个(PRIMARY KEY)
​唯一索引​列值唯一,允许NULL(UNIQUE KEY)
​普通索引​无唯一性限制(INDEX或KEY)
​组合索引​多列联合组成的索引
组合索引(复合索引)
  • ​示例​​:INDEX idx_name_age (name, age)
  • ​最左前缀原则​​:查询条件必须包含组合索引的左侧列才能生效。
    例如:
    • ✅ 有效:WHERE name = 'Alice' AND age = 25
    • ✅ 有效:WHERE name = 'Bob'
    • ❌ 无效:WHERE age = 30(未使用最左列name

4. 索引的创建与管理

4.1 创建索引

语法
-- 创建普通索引
CREATE INDEX idx_name ON table_name (column1, column2);-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique_email ON users (email);-- 修改表结构添加索引
ALTER TABLE orders ADD INDEX idx_order_date (order_date);
创建主键索引
ALTER TABLE employees ADD PRIMARY KEY (id);

4.2 删除索引

DROP INDEX idx_name ON table_name;
ALTER TABLE table_name DROP INDEX idx_name;

5. 索引使用注意事项

  1. ​不要过度索引​​:

    • 索引会占用存储空间,并增加写操作开销。
    • 建议只为频繁查询的列或WHERE/JOIN条件中的列创建索引。
  2. ​选择高选择性列​​:

    • 选择性高的列(如唯一值多的列,如用户ID)更适合作为索引。
  3. ​避免重复索引​​:

    • 例如已存在INDEX (a, b),再创建INDEX (a)是冗余的。
  4. ​使用EXPLAIN分析查询​​:

    EXPLAIN SELECT * FROM users WHERE name = 'Alice';
    • 检查是否命中索引(key字段显示使用的索引)。

6. 索引的优缺点总结

优点缺点
加速查询速度占用额外存储空间
减少服务器扫描的数据量增删改操作需维护索引,降低写性能
帮助避免排序和临时表不合理的索引可能导致查询更慢
http://www.xdnf.cn/news/330211.html

相关文章:

  • ZYNQ笔记(十八):VDMA VGA彩条显示
  • 软考错题(一)
  • 格式工厂:一站式多媒体文件转换专家
  • 全网通电视 1.0 | 支持安卓4系统的直播软件,提供众多港台高清频道
  • 深入理解 Pinia:从基础到进阶的完整指南
  • 从交互说明文档,到页面流程图设计全过程
  • bpftrace 中使用 bpf_trace_printk
  • Soft Mask(软遮罩)技术
  • 【多线程】用阻塞队列实现等待唤醒机制(Java实现)
  • Python中的global与nonlocal关键字详解
  • 【软件测试学习day6】WebDriver常用的API
  • Java后端开发day43--IO流(三)--缓冲流转换流序列化流
  • 如何在本地测试网站运行情况
  • Kubernetes生产实战:容器内无netstat时的7种端口排查方案
  • 如何理解参照权
  • 如何设置飞书多维表格,可以在扣子平台上使用
  • Python办公自动化应用(三)
  • 备注在开发中的重要作用
  • MySQL数据库高可用(MHA)详细方案与部署教程
  • 国标GB28181视频平台EasyGBS打造电力行业变电站高效智能视频监控解决方案
  • 统计匹配的二元组个数 - 华为OD机试真题(A卷、JavaScript题解)
  • 宝塔面板,删除项目后还能通过域名进行访问
  • 从人脸扫描到实时驱动,超写实数字分身技术解析
  • Go语言中的并发编程--详细讲解
  • 【赵渝强老师】TiDB的备份恢复策略
  • 将本地项目提交到新建的git仓库
  • 【性能工具】一种简易hook bitmap创建的插件使用
  • Docker + Watchtower 实现容器自动更新:高效运维的终极方案
  • 算法研习:最大子数组和问题深度剖析
  • YOLO-POSE 姿态扩充