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

相关推荐
影子240119 分钟前
Navicat导出mysql数据库表结构说明到excel、word,单表导出方式记录
数据库·mysql·excel
java_heartLake1 小时前
PostgreSQL15深度解析(从15.0-15.12)
数据库·postgresql
nuc-1273 小时前
sqli-labs学习记录8
数据库·学习·sqli-labs
余华余华4 小时前
计算机等级考试数据库三级(笔记3)
服务器·数据库·oracle
南風_入弦4 小时前
Oracle logminer详解
数据库·oracle·恢复
小安同学iter5 小时前
SpringBoot (二) 日志系统
数据库·spring boot·后端
Chandler246 小时前
Redis:事务
数据库·redis·缓存
开发小能手-roy6 小时前
ubuntu 安装mysql
mysql·ubuntu·adb
是阿建吖!7 小时前
【MySQL】事务
数据库·mysql
Asuka077 小时前
MySQL数据库和表的操作
数据库·mysql