单列索引:一个索引只包含一个列。
复合索引:一个索引包含两个或更多的列。
覆盖索引:当所有要检索的列都包含在索引中时,查询可以只利用索引来完成,而无需额外访问数据表。

优化策略:

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 命令)优化索引策略。

09-26 18:57