概述
- 索引是数据库管理系统中的一种数据结构,用于快速查找和检索表中的记录
- 通过在列或列的组合上创建索引,可以显著提高查询性能
原理
- 在
InnoDB
中,表的数据存储在表空间(tablespace
)中,表空间由多个页(pages
)组成,- 每个页通常为
16KB
- 每个页包含多个行
- 行数据包括表的各列数据
- 索引通过指向页和行偏移的指针来快速查找数据
- 每个页通常为
- 创建索引过程:
- 当您创建一个索引时,首先需要指定要在哪个表的哪一列上创建索引
这一步骤将索引与目标表的指定列关联起来 - 数据库会扫描目标列中的所有值,并构建一个索引数据结构(如
B+
树) - 在
B+
树的叶子节点上,存储索引键(即目标列的值)和指向实际数据行的指针
每个叶子节点存储一个索引键值(例如,emp_name
列的值)以及一个指向数据行的指针
指针通常包括页编号和页内偏移,指示数据行在表空间中的确切位置
- 当您创建一个索引时,首先需要指定要在哪个表的哪一列上创建索引
索引类型
-
单列索引(
Single-Column Index
):基于单个列创建的索引CREATE INDEX idx_column1 ON table_name(column1);
-
多列索引(
Multi-Column Index
):基于多个列创建的索引,也称为组合索引(Composite Index
)CREATE INDEX idx_columns ON table_name(column1, column2);
-
唯一索引(
Unique Index
):保证索引列中的值是唯一的,不允许重复CREATE UNIQUE INDEX idx_unique_column1 ON table_name(column1);
-
全文索引(
Full-Text Index
):用于对文本数据进行全文搜索(仅限于CHAR
、VARCHAR
和TEXT
列)CREATE FULLTEXT INDEX idx_fulltext_column1 ON table_name(column1);
-
空间索引(
Spatial Index
):用于地理数据的快速查询(如GEOMETRY
类型)CREATE SPATIAL INDEX idx_spatial_column1 ON table_name(geometry_column);
数据结构
B
树索引(B-Tree Index
)- 最常见的索引类型,适用于大多数查询
B
树是一种自平衡树结构,支持快速的查找、插入和删除操作
- 哈希索引(
Hash Index
)- 使用哈希表实现,适用于等值查询(
=
) - 不适用于范围查询(
<, >, BETWEEN
)
- 使用哈希表实现,适用于等值查询(
- 全文索引(
Full-Text Index
)- 使用倒排索引结构,适用于全文搜索
- 空间索引(
Spatial Index
)- 使用
R
树或其他空间数据结构,适用于地理空间数据
- 使用
优点
- 提高查询速度:索引可以显著提高
SELECT
语句的查询速度 - 加速排序和分组操作:索引可以加速
ORDER BY
、GROUP BY
、DISTINCT
等操作 - 加速连接操作:索引可以加速
JOIN
操作,特别是在大表之间的连接
缺点
- 增加存储空间:索引需要额外的存储空间来存储索引结构
- 降低写操作性能:每次插入、更新或删除数据时,索引也需要相应地更新,这会降低写操作的性能
操作
在表创建时创建索引
1 2 3 4 5 6 7 8 |
CREATE TABLE employees ( emp_id INT PRIMARY KEY, emp_name VARCHAR(255), dept_id INT, salary DECIMAL(10, 2), hire_date DATE, INDEX idx_emp_name (emp_name) ); |
在表创建后添加索引
1 2 3 |
CREATE INDEX idx_emp_name ON employees(emp_name); CREATE UNIQUE INDEX idx_unique_emp_id ON employees(emp_id); CREATE FULLTEXT INDEX idx_fulltext_emp_name ON employees(emp_name); |
删除索引
1 |
DROP INDEX idx_emp_name ON employees; |
删除唯一索引
1 |
DROP INDEX idx_unique_emp_id ON employees; |
使用索引查询
- 数据库管理系统会自动使用索引来优化查询
- 你不需要在查询中显式地指定使用哪个索引
- 数据库查询优化器会根据查询条件自动选择最优的索引
适用场景
- 选择性高的列上创建索引
- 选择性高的列(不同值多的列)上创建索引可以显著提高查询效率
- 避免在频繁更新的列上创建索引
- 在频繁更新的列上创建索引可能会降低写操作的性能
- 合理使用组合索引
- 在多个列上进行查询时,组合索引可以显著提高查询效率
- 监控和优化索引
- 定期使用数据库提供的工具(如
EXPLAIN
语句)来监控和优化索引
- 定期使用数据库提供的工具(如
1 |
EXPLAIN SELECT * FROM employees WHERE emp_name = 'Alice'; |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 表_约束-外键10/27
- ♥ 表_约束-主键10/26
- ♥ 连接查询-子查询10/26
- ♥ 表_修改表结构10/26
- ♥ 数据库设计三范式简介10/28
- ♥ 存储引擎_介绍 && 选择10/28