联合索引和单个索引是两种常见的索引类型,它们的主要区别在于索引的列数和适用的查询场景。
单个索引
单个索引是针对单一列建立的索引。例如:
CREATE INDEX idx_column1 ON table_name(column1);
特点:
- 针对单一列优化:只对
column1
上的查询起作用。 - 适用场景:
- 查询条件中只涉及这一个列,例如:
SELECT * FROM table_name WHERE column1 = 'value';
- 或者对该列排序时,例如:
SELECT * FROM table_name ORDER BY column1;
- 查询条件中只涉及这一个列,例如:
- 简单高效:维护成本低,占用资源少。
联合索引
联合索引(也称复合索引)是针对多个列组合建立的索引。例如:
CREATE INDEX idx_columns ON table_name(column1, column2);
特点:
- 多列联合优化:可用于同时涉及
column1
和column2
的查询。 - 遵循最左前缀匹配原则:
- 索引可用于
column1
或column1
和column2
的组合查询,但无法单独用于column2
。 - 示例:
- 可以使用索引:
SELECT * FROM table_name WHERE column1 = 'value1'; SELECT * FROM table_name WHERE column1 = 'value1' AND column2 = 'value2';
- 不能使用索引:
SELECT * FROM table_name WHERE column2 = 'value2';
- 可以使用索引:
- 索引可用于
- 适用场景:
- 查询频繁涉及多列条件的场景,例如:
SELECT * FROM table_name WHERE column1 = 'value1' AND column2 > 50;
- 需要对多列进行排序时,例如:
SELECT * FROM table_name ORDER BY column1, column2;
- 查询频繁涉及多列条件的场景,例如:
主要区别
属性 | 单个索引 | 联合索引 |
---|---|---|
适用列数 | 一列 | 多列 |
查询优化 | 针对单列的查询和排序 | 针对多列查询或排序 |
存储空间 | 较小 | 较大 |
使用限制 | 只能优化单列 | 遵循最左前缀匹配原则 |
维护成本 | 较低 | 较高 |
实践中的建议
-
单列索引适合单独频繁使用的列:
- 如主键、唯一键,或常用于筛选的列。
- 示例:
CREATE INDEX idx_salary ON employees(salary);
-
联合索引适合多列组合查询:
- 如查询经常用
WHERE column1 AND column2
或ORDER BY column1, column2
。 - 示例:
CREATE INDEX idx_dept_salary ON employees(department, salary);
- 如查询经常用
-
避免重复索引:
- 如果已经有联合索引
(column1, column2)
,则不必再单独为column1
创建索引。
- 如果已经有联合索引
-
谨慎添加过多索引:
- 索引会占用额外的存储空间,同时增加数据更新的开销。