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 分析查询执行计划:

相关推荐
秃头摸鱼侠14 分钟前
MySQL查询语句(续)
数据库·mysql
MuYiLuck22 分钟前
【redis实战篇】第八天
数据库·redis·缓存
睡觉待开机22 分钟前
6. MySQL基本查询
数据库·mysql
大熊猫侯佩1 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩1 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩1 小时前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift
大熊猫侯佩1 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
数据库·swiftui·swift
Ares-Wang1 小时前
负载均衡LB》》HAproxy
运维·数据库·负载均衡
AI.NET 极客圈2 小时前
.NET 原生驾驭 AI 新基建实战系列(四):Qdrant ── 实时高效的向量搜索利器
数据库·人工智能·.net
weixin_470880262 小时前
MySQL体系架构解析(二):MySQL目录与启动配置全解析
数据库·mysql·面试·mysql体系架构·mysql bin目录