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

相关推荐
等....1 天前
Minio使用
数据库
win x1 天前
Redis 使用~如何在Java中连接使用redis
java·数据库·redis
迷枫7121 天前
DM8 数据库安装实战:从零搭建达梦数据库环境(附全套工具链接)
数据库
XDHCOM1 天前
PostgreSQL 25001: active_sql_transaction 报错原因分析,故障修复步骤详解,远程处理解决方案
数据库·sql·postgresql
卤炖阑尾炎1 天前
PostgreSQL 日常运维全指南:从基础操作到备份恢复
运维·数据库·postgresql
daad7771 天前
wifi_note
运维·服务器·数据库
计算机毕设vx_bysj68691 天前
【免费领源码】77196基于java的手机银行app管理系统的设计与实现 计算机毕业设计项目推荐上万套实战教程JAVA,node.js,C++、python、大屏数据可视化
java·mysql·智能手机·课程设计
吴声子夜歌1 天前
ES6——正则的扩展详解
前端·mysql·es6
xixingzhe21 天前
Mysql统计空间增量
数据库·mysql
程序员萌萌1 天前
Java之mysql实战讲解(三):聚簇索引与非聚簇索引
java·mysql·聚簇索引