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

相关推荐
jiayou642 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
随风飘的云3 小时前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
NineData14 小时前
NineData 迁移评估功能正式上线
数据库·dba
NineData19 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师1 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石1 天前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_2 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou643 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北3 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤4 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库