好的,索引是数据库性能优化的关键工具,但使用不当反而会降低效率。理解并遵循索引的使用规则至关重要。以下是核心的索引使用规则和最佳实践:
核心目标: 让数据库系统能够快速定位到所需的数据行,避免低效的全表扫描。
一、 创建索引的规则(何时建、建在哪儿)
-
为查询的 WHERE 子句条件列创建索引:
- 这是最常见和最重要的规则。如果查询中经常根据某个或某几个列进行过滤 (
WHERE column = value
,WHERE column > value
,WHERE column IN (...)
,WHERE column LIKE 'prefix%'
),为这些列创建索引能极大提升查询速度。 - 示例:
SELECT * FROM orders WHERE customer_id = 123;
=> 在customer_id
上建索引。
- 这是最常见和最重要的规则。如果查询中经常根据某个或某几个列进行过滤 (
-
为连接 (
JOIN
) 条件列创建索引:- 当表之间进行连接时,连接条件列(通常是外键)上的索引能显著加速连接操作。
- 示例:
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id;
=> 在orders.customer_id
和customers.id
上建索引。
-
为排序 (
ORDER BY
) 和分组 (GROUP BY
) 的列创建索引:- 如果查询需要按特定列排序或分组,且这些列不在
WHERE
子句中,在这些列上创建索引可以避免昂贵的文件排序操作。 - 示例:
SELECT department, COUNT(*) FROM employees GROUP BY department;
=> 在department
上建索引可能有益(如果数据量大)。SELECT * FROM products ORDER BY price DESC;
=> 在price
上建索引。
- 如果查询需要按特定列排序或分组,且这些列不在
-
考虑覆盖索引:
- 如果一个索引包含了查询中需要的所有字段(不仅仅是
WHERE
中的字段),数据库可以直接从索引中获取数据,无需回表查询数据行,效率最高。 - 示例:
SELECT customer_id, order_date FROM orders WHERE status = 'Shipped';
=> 创建
- 如果一个索引包含了查询中需要的所有字段(不仅仅是