单列索引:一个索引只包含一个列。
复合索引:一个索引包含两个或更多的列。
覆盖索引:当所有要检索的列都包含在索引中时,查询可以只利用索引来完成,而无需额外访问数据表。
优化策略:
1. 选择正确的索引列:
通常,应在搜索条件(WHERE子句)、连接条件(JOIN 子句)以及需要排序的字段(ORDER BY子句)上创建索引。
2. 避免过度索引:
每一个新索引都会增加插入、更新、删除操作的开销,因为索引也需要进行维护。
定期审查索引,并删除冗余或不再使用的索引。
3. 使用复合索引:
在查询中经常组合使用的多个列上创建复合索引。
注意复合索引的列顺序,尤其是当某些列只用于过滤,而其他列用于排序或连接时。
4. 使用覆盖索引:
试图设计查询和索引,使得查询可以只使用索引,避免访问实际的数据行。
5. 避免在索引列上使用函数或操作:
使用函数,如 UPPER(column),会使索引失效,因为它修改了列的原始值。
6. 注意数据的选择性:
数据的选择性是唯一值与总记录数之间的比例。
高选择性的列(即包含许多唯一值的列)是创建索引的好候选者。
7. 考虑存储引擎的特性:
如,InnoDB 存储引擎在主键索引上存储数据,所以选择合适的主键非常关键。
代码示例:
1.单列索引:
如果经常基于 last_name 查询,那么这是一个合适的索引
CREATE INDEX idx_lastname ON employees(last_name);
2. 复合索引:
如果经常同时基于 last_name 和 first_name 查询
CREATE INDEX idx_fullname ON employees(last_name, first_name);
3. 覆盖索引的使用:
假设我们对 employees 表的 last_name 和 first_name 有一个复合索引
下面的查询只使用索引
SELECT last_name, first_name FROM employees WHERE last_name = 'Smith';
4. 避免在索引列上使用函数:
不良的查询,它在索引列上使用了函数
SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';
优化后的查询
SELECT * FROM employees WHERE last_name = 'Smith';
正确的索引策略需要考虑查询模式、数据分布和数据库的特性。它通常需要多次迭代和细调。利用数据库的查询执行计划工具(如 MySQL 的 EXPLAIN 命令)优化索引策略。