适合创建索引的列
- 经常用于查询条件的列:如果在
SELECT
语句的 WHERE
子句中频繁使用某列作为条件进行数据筛选,那么在该列上创建索引可以显著提升查询性能。例如,在一个员工表中,经常根据员工的部门编号查询员工信息,那么在部门编号列上创建索引是合适的。
-- 假设员工表为employees,部门编号列是department_id
CREATE INDEX idx_department_id ON employees(department_id);
- 连接条件中的列:当使用
JOIN
操作连接多个表时,连接条件中的列适合创建索引。比如,在订单表 orders
和客户表 customers
进行连接查询,连接条件可能是客户ID列。
-- 订单表orders,客户ID列是customer_id
CREATE INDEX idx_customer_id_orders ON orders(customer_id);
-- 客户表customers,客户ID列是customer_id
CREATE INDEX idx_customer_id_customers ON customers(customer_id);
- 排序或分组的列:若经常在
ORDER BY
或 GROUP BY
子句中使用某列,创建索引有助于加快排序和分组操作。例如,对销售表按销售额进行分组统计。
-- 销售表sales,销售额列是sales_amount
CREATE INDEX idx_sales_amount ON sales(sales_amount);
创建索引可能带来的负面影响
- 增加存储开销:每个索引都需要额外的存储空间来存储索引数据结构。随着表中数据量的增加以及索引数量的增多,这种存储开销会变得相当可观。例如,一个包含大量数据的日志表,若在多个列上创建索引,索引占用的空间可能会接近甚至超过数据本身占用的空间。
- 降低数据修改性能:当执行
INSERT
、UPDATE
或 DELETE
操作时,数据库不仅要更新表中的数据,还要同时更新相关的索引。这意味着每次数据修改操作都需要更多的I/O和计算资源,从而导致操作速度变慢。例如,在一个频繁插入新订单的订单表中,如果索引过多,插入操作的性能会明显下降。
- 查询优化器选择复杂性增加:过多的索引可能会使查询优化器在选择执行计划时面临更多的选择,增加了优化器做出次优选择的可能性。这可能导致查询性能不但没有提升,反而下降。例如,复杂的查询在有大量索引的情况下,优化器可能花费更多时间评估不同索引的使用方式,而不是快速选择最优执行路径。