mysql 索引

MySQL 索引是数据库中用于加速数据查询的一种数据结构。它类似于书籍的目录,通过预先建立特定列(或列组合)的索引,数据库可以快速定位到数据的位置,避免全表扫描,从而显著提升查询性能。

1. 索引的类型

1.1 按数据结构分类

  • B-Tree 索引(默认索引类型):

    • 适用于等值查询(=)和范围查询(>, <, BETWEEN)。

    • 支持字符串前缀索引(如 INDEX (name(10)))。

    • 适用场景:大多数常规查询(如主键查询、普通字段查询)。

  • 哈希索引(Memory 引擎支持):

    • 仅支持等值查询(=),不支持范围查询。

    • 查询速度极快(时间复杂度接近 O(1))。

    • 适用场景:内存表(MEMORY 引擎)的快速等值查询。

  • 全文索引(FULLTEXT):

    • 用于文本字段的全文搜索(如 MATCH ... AGAINST)。

    • 支持自然语言和布尔模式搜索。

    • 适用场景:大文本字段的模糊匹配(如文章内容搜索)。

  • 空间索引(R-Tree):

    • 用于地理空间数据类型(如 GEOMETRY, POINT)。

    • 支持空间关系查询(如 ST_Contains, ST_Distance)。

1.2 按逻辑功能分类

  • 主键索引(PRIMARY KEY):

    • 唯一且非空的索引,每个表只能有一个主键。

    • 默认按主键聚簇存储数据(InnoDB 引擎)。

  • 唯一索引(UNIQUE):

    • 确保列值的唯一性(允许 NULL 值)。

    • 可用于避免重复数据。

  • 普通索引(INDEX 或 KEY):

    • 无唯一性约束,仅用于加速查询。
  • 组合索引(多列索引):

    • 基于多个列的联合索引(如 INDEX (col1, col2))。

    • 遵循最左前缀原则(查询需包含索引最左列)。

2. 索引的创建与删除

2.1 创建索引

-- 单列普通索引

CREATE INDEX idx_name ON table_name (column_name);

-- 唯一索引

CREATE UNIQUE INDEX idx_unique_email ON users (email);

-- 组合索引

CREATE INDEX idx_name_age ON users (name, age);

-- 全文索引(仅适用于 TEXT 类型字段)

CREATE FULLTEXT INDEX idx_content ON articles (content);

2.2 删除索引

DROP INDEX idx_name ON table_name;

3. 索引的优缺点

优点
  1. 加速查询 :显著减少 SELECT 操作的执行时间。

  2. 优化排序和分组 :索引可加速 ORDER BYGROUP BY

  3. 唯一性约束:唯一索引确保数据唯一性。

缺点
  1. 占用存储空间:索引需要额外的磁盘空间。

  2. 降低写操作速度INSERT/UPDATE/DELETE 需维护索引。

  3. 索引失效风险:不合理的索引设计可能导致索引未命中(如未遵循最左前缀原则)。

4. 索引的最佳实践

选择合适的列

  • 频繁作为查询条件的列(如 WHERE 子句中的列)。

  • 参与连接(JOIN)或排序(ORDER BY)的列。

避免过多索引

  • 每个索引都会增加写操作的开销,需权衡读写比例。

使用组合索引

  • 优先覆盖高频查询的多个条件。

  • 示例:INDEX (a, b) 可加速 WHERE a=1 AND b=2,但无法加速 WHERE b=2

注意前缀索引

  • 对长字符串字段(如 VARCHAR(255))使用前缀索引(如 INDEX (name(10)))。

监控索引使用情况

-- 查看索引使用统计

SELECT * FROM sys.schema_index_statistics;

  • 核心作用:索引是提升查询性能的核心工具,但需合理设计。

  • 平衡策略:在查询速度和写操作开销之间找到平衡。

  • 分析工具 :使用 EXPLAIN 分析查询执行计划:

相关推荐
和尚用0飘柔06 分钟前
【中间件】redis使用
数据库·redis·中间件
结衣结衣.1 小时前
【MySQL】数据类型
linux·数据库·sql·mysql
辰哥单片机设计1 小时前
雨滴传感器详解(STM32)
数据库·mongodb
努力也学不会java2 小时前
【Redis】Redis中的常见数据类型(一)
数据结构·数据库·redis·缓存·bootstrap
XY.散人2 小时前
初识Redis · 命令、数据结构补充、协议
数据库·redis·缓存
2501_911121232 小时前
Shell编程之正则表达式与文本处理器
数据库·mysql
海洋与大气科学3 小时前
Matlab画海洋与大气变量的时间序列并带标记面的三维折线图--来源粉丝
java·数据库·matlab
洛神灬殇3 小时前
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
数据库·redis·后端
GD_MI3 小时前
第七周作业
数据库
辰哥单片机设计4 小时前
非接触式水位传感器详解(STM32)
数据库·mongodb