MST

星途 面试题库

面试题:SQLite索引设计的基础原则相关问题

在SQLite中,简述创建索引时应遵循的一些基础原则,例如在什么样的列上适合创建索引,以及创建索引可能带来的负面影响有哪些?
40.8万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试

适合创建索引的列

  1. 经常用于查询条件的列:如果在 SELECT 语句的 WHERE 子句中频繁使用某列作为条件进行数据筛选,那么在该列上创建索引可以显著提升查询性能。例如,在一个员工表中,经常根据员工的部门编号查询员工信息,那么在部门编号列上创建索引是合适的。
-- 假设员工表为employees,部门编号列是department_id
CREATE INDEX idx_department_id ON employees(department_id);
  1. 连接条件中的列:当使用 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);
  1. 排序或分组的列:若经常在 ORDER BYGROUP BY 子句中使用某列,创建索引有助于加快排序和分组操作。例如,对销售表按销售额进行分组统计。
-- 销售表sales,销售额列是sales_amount
CREATE INDEX idx_sales_amount ON sales(sales_amount);

创建索引可能带来的负面影响

  1. 增加存储开销:每个索引都需要额外的存储空间来存储索引数据结构。随着表中数据量的增加以及索引数量的增多,这种存储开销会变得相当可观。例如,一个包含大量数据的日志表,若在多个列上创建索引,索引占用的空间可能会接近甚至超过数据本身占用的空间。
  2. 降低数据修改性能:当执行 INSERTUPDATEDELETE 操作时,数据库不仅要更新表中的数据,还要同时更新相关的索引。这意味着每次数据修改操作都需要更多的I/O和计算资源,从而导致操作速度变慢。例如,在一个频繁插入新订单的订单表中,如果索引过多,插入操作的性能会明显下降。
  3. 查询优化器选择复杂性增加:过多的索引可能会使查询优化器在选择执行计划时面临更多的选择,增加了优化器做出次优选择的可能性。这可能导致查询性能不但没有提升,反而下降。例如,复杂的查询在有大量索引的情况下,优化器可能花费更多时间评估不同索引的使用方式,而不是快速选择最优执行路径。