面试题答案
一键面试索引设计思路
- 覆盖索引:对于常见的查询,设计索引时尽量包含查询中涉及的所有列,这样查询时可直接从索引中获取数据,无需回表操作,提升查询性能。例如对于查询
SELECT column1, column2, column3 FROM your_table WHERE condition;
,若经常有此查询,可创建复合索引CREATE INDEX idx_column1_column2_column3 ON your_table (column1, column2, column3);
。 - 最左前缀原则:复合索引在使用时遵循最左前缀原则。如果查询条件为
WHERE column1 = value1 AND column2 = value2;
,则索引CREATE INDEX idx_column1_column2 ON your_table (column1, column2);
可有效利用。若查询为WHERE column2 = value2;
,此索引则无法使用。 - 避免冗余索引:冗余索引是指一个索引的前导列是另一个索引的前缀。例如已有索引
CREATE INDEX idx_column1_column2 ON your_table (column1, column2);
,再创建CREATE INDEX idx_column1 ON your_table (column1);
就是冗余的,因为前者已包含后者功能。 - 分析查询频率:对频繁查询的字段组合创建索引,对于很少使用的查询条件字段,可不创建索引,避免索引过多影响插入、更新性能。
具体SQL语句示例
假设有表orders
,包含字段order_id
, customer_id
, order_date
, total_amount
,常见查询有:
- 根据客户ID查询订单信息
SELECT order_id, order_date, total_amount FROM orders WHERE customer_id = 123;
此时可创建索引CREATE INDEX idx_customer_id ON orders (customer_id);
2. 根据客户ID和订单日期范围查询订单信息
SELECT order_id, total_amount FROM orders WHERE customer_id = 123 AND order_date BETWEEN '2023 - 01 - 01' AND '2023 - 12 - 31';
可创建复合索引CREATE INDEX idx_customer_id_order_date ON orders (customer_id, order_date);
,因遵循最左前缀原则,先列customer_id
。
3. 若有查询SELECT customer_id, order_date FROM orders WHERE total_amount > 1000;
可创建索引CREATE INDEX idx_total_amount ON orders (total_amount);
,若此查询不频繁,可不创建此索引以避免过多索引影响写操作性能。