面试题答案
一键面试索引创建策略
- 选择合适的字段
- 针对经常用于
WHERE
子句、连接条件(JOIN
)、排序(ORDER BY
)和分组(GROUP BY
)的字段创建索引。例如,如果经常根据用户表中的user_id
和registration_date
进行查询,可为这两个字段创建索引。 - 避免过度索引,只创建必要的索引。因为过多索引会增加插入、更新和删除操作的成本,因为每次数据变动都需要更新相关索引。
- 针对经常用于
- 复合索引
- 对于多个字段联合查询的场景,创建复合索引。例如,查询语句为
SELECT * FROM orders WHERE order_date BETWEEN '2023 - 01 - 01' AND '2023 - 12 - 31' AND customer_id = 123;
,可以创建复合索引(order_date, customer_id)
。复合索引中字段的顺序很重要,应将选择性高(区分度大)的字段放在前面。
- 对于多个字段联合查询的场景,创建复合索引。例如,查询语句为
- 前缀索引
- 对于长字符串字段,使用前缀索引可减少索引存储空间并提高查询性能。例如,对于一个长文本字段
product_description
,如果经常根据前几个字符进行查询,可以创建前缀索引,如CREATE INDEX idx_product_desc ON products (product_description(10));
,这里的10表示使用前10个字符创建索引。
- 对于长字符串字段,使用前缀索引可减少索引存储空间并提高查询性能。例如,对于一个长文本字段
索引维护策略
- 定期重建索引
- 随着数据的不断插入、删除和更新,B+树索引可能会出现碎片化。定期重建索引(例如在业务低峰期)可以优化索引结构,提高查询性能。在MySQL中,可以使用
ALTER TABLE table_name DROP INDEX index_name;
和CREATE INDEX index_name ON table_name (column_list);
来重建索引。
- 随着数据的不断插入、删除和更新,B+树索引可能会出现碎片化。定期重建索引(例如在业务低峰期)可以优化索引结构,提高查询性能。在MySQL中,可以使用
- 更新统计信息
- MySQL依赖统计信息来生成执行计划。定期使用
ANALYZE TABLE
语句更新表的统计信息,确保查询优化器能根据最新数据分布选择最优执行计划。例如,在大量数据插入或删除后,及时执行ANALYZE TABLE products;
。
- MySQL依赖统计信息来生成执行计划。定期使用
索引调整策略
- 监控索引使用情况
- 使用
SHOW STATUS LIKE 'Handler_read%';
命令监控索引的使用情况。Handler_read_rnd_next
值过高可能表示全表扫描过多,需要优化索引;Handler_read_key
表示通过索引读取的次数,可用于评估索引的有效性。 - 利用MySQL的查询日志(如慢查询日志),分析查询语句执行时间长的原因,判断是否因为索引不合理导致。
- 使用
- 动态调整索引
- 根据业务需求的变化动态调整索引。如果业务从主要按用户ID查询转变为按用户所在地区查询,应相应调整或创建新的索引以适应新的查询模式。
- 分区表索引
- 对于大型表,使用分区表并为每个分区创建索引。例如,按时间分区的订单表,可以按月份分区,每个分区有独立的索引。这样在查询特定时间段的数据时,只需访问相关分区的索引,减少I/O操作,提高查询性能。