面试题答案
一键面试索引设计
为了优化根据 customer_id
和 order_date
范围查询订单,并按 total_amount
排序的查询,建议创建一个复合索引:
CREATE INDEX idx_customer_date_amount ON orders (customer_id, order_date, total_amount);
设计原因
- 前缀匹配原则:复合索引的最左前缀原则,查询时先根据
customer_id
过滤,然后在这个基础上再根据order_date
范围过滤,这样能快速定位到符合条件的记录。如果不把customer_id
放在最左边,索引可能无法有效利用。 - 排序优化:将
total_amount
放在索引的最后,数据库在获取到符合customer_id
和order_date
条件的记录后,可以直接利用索引的顺序进行排序,避免了额外的排序操作,提升查询效率。
高并发场景下可能面临的问题及解决方法
- 锁争用问题:
- 问题描述:高并发场景下,多个事务可能同时对使用该索引的记录进行读写操作,容易导致锁争用,降低系统并发性能。
- 解决方法:可以采用合适的事务隔离级别,如读已提交(Read Committed)或可重复读(Repeatable Read),并合理控制事务的粒度和持续时间。尽量缩短事务的执行时间,减少锁的持有时间。同时,可以考虑使用乐观锁机制,通过版本号或时间戳来控制并发访问,减少锁争用。
- 索引维护成本:
- 问题描述:高并发写入操作会频繁更新索引,增加索引的维护成本,可能导致性能下降。
- 解决方法:可以采用批量写入的方式,减少索引更新的次数。另外,可以在业务允许的情况下,定期进行索引重建或优化操作,以保持索引的高效性。还可以考虑使用异步索引更新机制,将索引更新操作放到异步任务中执行,减少对主业务流程的影响。