面试题答案
一键面试索引设计思路
- 商品表products
- product_id:创建主键索引,因为在订单表中关联商品表会频繁使用商品ID,主键索引可快速定位商品记录,同时确保商品ID的唯一性。在高并发查询商品详情等操作时,基于主键索引能快速返回数据。
- price:若存在按价格范围查询商品的场景,如查询价格在某个区间的商品,可创建普通索引。这有助于在高并发下快速筛选出符合价格条件的商品。
- stock:若有基于库存的查询需求,如查询库存低于某个阈值的商品,创建普通索引可加速此类查询。在高并发场景下,对库存相关的预警等操作能快速获取数据。
- 订单表orders
- order_id:创建主键索引,保证订单ID的唯一性,且在查询单个订单详情等操作时能快速定位。在高并发读取订单信息时,主键索引能提高查询效率。
- customer_id:若经常需要根据客户ID查询该客户的所有订单,创建普通索引。在高并发场景下,如客户查看自己订单列表时,可快速定位相关订单记录。
- product_id:创建普通索引,因为订单表与商品表通过product_id关联,在处理订单时可能需要快速根据商品ID找到对应的商品信息,在高并发订单处理时可加速这种关联查询。
- order_time:若有按订单时间范围查询订单的需求,如查询近一周内的订单,创建普通索引能加快此类查询速度。在高并发的统计等操作中,按时间范围查询订单数据时能提高效率。
高并发环境下可能遇到的索引相关问题及解决方案
- 索引维护开销大
- 问题描述:在高并发写入场景下,对表进行插入、更新、删除操作时,数据库需要同时维护索引,这会增加系统开销,影响并发处理能力。例如大量订单数据的插入,不仅要写入订单表,还要更新相关索引。
- 解决方案:采用批量操作,减少索引维护次数。例如将多个订单插入操作合并为一次批量插入,这样数据库只需在批量操作完成后维护一次索引。另外,可以在业务低峰期进行索引重建或优化操作,以减少对正常业务的影响。
- 锁争用
- 问题描述:高并发下,多个事务可能同时对包含索引的表进行操作,导致锁争用。比如一个事务在更新商品库存(涉及stock索引),另一个事务同时查询库存相关数据,可能会等待锁释放,降低并发性能。
- 解决方案:优化事务隔离级别,根据业务场景选择合适的隔离级别,如读提交(Read Committed)或可重复读(Repeatable Read),以减少锁的持有时间。同时,合理设计事务,尽量缩短事务的执行时间,避免长时间持有锁。
- 索引膨胀
- 问题描述:随着数据量的不断增长,索引占用的存储空间也会不断增大,可能导致内存不足等问题,影响查询性能。
- 解决方案:定期对索引进行分析和优化,删除不必要的索引。例如某些索引在业务变更后不再使用,及时删除可减少索引存储空间占用。同时,可以考虑使用更紧凑的索引结构,如前缀索引,在保证查询性能的前提下减少索引空间占用。