1. 索引列的选择
- 选择合适的列
- 应选择在
WHERE
、JOIN
和ORDER BY
子句中频繁使用的列创建索引。例如,在一个电商系统的订单表中,如果经常需要根据订单状态(如WHERE order_status = 'completed'
)查询订单,那么order_status
列就适合创建索引。这样可以显著提高查询速度。 - 对于那些具有高选择性(列中不同值的数量与行数的比值较高)的列,索引效果会更好。比如用户表中的
email
字段,由于每个用户的邮箱通常是唯一的,选择性很高,所以在该列上创建索引能有效加速查询,如通过邮箱查找用户信息(SELECT * FROM users WHERE email = 'user@example.com'
)。
- 应选择在
- 避免过度索引
- 索引会增加数据插入、更新和删除操作的成本,因为数据库需要同时更新索引结构。所以不要为每个列都创建索引。例如一个包含日志信息的表,其中有很多文本内容的列用于记录详细的操作信息,如果这些列很少用于查询,就不应该为它们创建索引。
2. 索引类型的选择
- B - Tree 索引(默认)
- B - Tree 索引适用于大多数情况,特别是对于范围查询(如
WHERE column BETWEEN value1 AND value2
)、等值查询(如WHERE column = value
)和ORDER BY
操作。例如,在一个存储产品价格的表中,使用 B - Tree 索引可以高效地查询某个价格区间内的产品(SELECT * FROM products WHERE price BETWEEN 10 AND 20
)。
- B - Tree 索引适用于大多数情况,特别是对于范围查询(如
- 哈希索引
- 哈希索引在等值查询(如
WHERE column = value
)上速度非常快,但是不支持范围查询。例如在一个缓存用户登录信息的表中,通过用户 ID 快速查找用户登录状态(SELECT logged_in FROM user_cache WHERE user_id = 123
),哈希索引可以提供快速的查找。不过要注意,在 MySQL 中,只有 Memory 存储引擎支持显式的哈希索引,InnoDB 存储引擎会在内部对某些索引使用自适应哈希索引(由数据库自动管理)。
- 哈希索引在等值查询(如
- 全文索引
- 用于在文本类型的列中进行全文搜索。如果有一个博客文章表,需要通过文章内容进行关键词搜索,那么可以在文章内容列(如
article_content
)上创建全文索引。但是全文索引在维护和查询性能方面有其特点,它的使用场景相对较窄,并且需要考虑语言特性等因素。
- 用于在文本类型的列中进行全文搜索。如果有一个博客文章表,需要通过文章内容进行关键词搜索,那么可以在文章内容列(如
3. 复合索引
- 列的顺序很重要
- 当创建复合索引(包含多个列的索引)时,应将最常用的列放在最左边。例如,在一个员工表中有
department
(部门)和salary
(工资)两个列,经常会按照部门查询员工工资范围(SELECT * FROM employees WHERE department = 'IT' AND salary BETWEEN 5000 AND 10000
),那么创建复合索引时应该是(department, salary)
这样的顺序。因为在查询时,MySQL 会首先使用索引中的第一个列进行过滤,然后再考虑后面的列。
- 当创建复合索引(包含多个列的索引)时,应将最常用的列放在最左边。例如,在一个员工表中有
- 索引覆盖
- 尽量利用索引覆盖来减少回表查询。如果一个查询的所有列都包含在索引中,那么数据库可以直接从索引中获取数据,而不需要再去查找数据表中的行。例如,在一个包含
id
、name
和age
的用户表上,有一个索引(id, name)
,当执行查询SELECT id, name FROM users WHERE id BETWEEN 1 AND 10
时,就可以直接从索引中获取数据,提高查询效率。
- 尽量利用索引覆盖来减少回表查询。如果一个查询的所有列都包含在索引中,那么数据库可以直接从索引中获取数据,而不需要再去查找数据表中的行。例如,在一个包含
4. 索引维护
- 定期重建和优化索引
- 随着数据的插入、更新和删除,索引可能会变得碎片化,降低查询性能。对于 InnoDB 存储引擎,可以使用
OPTIMIZE TABLE
命令来重新组织表和索引的物理存储,减少碎片。例如,对于一个数据频繁变动的订单表,可以定期(如每月一次)执行OPTIMIZE TABLE orders
来维护索引。
- 随着数据的插入、更新和删除,索引可能会变得碎片化,降低查询性能。对于 InnoDB 存储引擎,可以使用
- 监控索引使用情况
- 可以使用 MySQL 的性能监控工具(如
EXPLAIN
命令)来查看查询是否使用了索引以及如何使用索引。EXPLAIN
会显示查询的执行计划,包括是否使用索引、使用了哪些索引以及索引的使用方式等信息。例如,EXPLAIN SELECT * FROM products WHERE price > 100
可以帮助了解在这个价格查询中索引是否被有效利用。如果发现索引没有被正确使用,就需要检查查询语句和索引定义是否合理。
- 可以使用 MySQL 的性能监控工具(如