MST
星途 面试题库

面试题:复杂业务场景下MySQL避免冗余索引的设计思路

假设存在一个电商系统,涉及商品、订单、用户等多张复杂关联表,且有多种复杂查询场景。阐述在设计数据库索引时,如何避免冗余索引同时满足各类查询需求,需结合具体SQL语句及索引设计思路说明。
43.9万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试
  1. 索引设计思路
    • 分析查询需求:仔细研究电商系统中各类查询场景。例如,常见的查询可能有根据用户ID查询其所有订单,根据订单ID查询订单详情(涉及订单与商品关联),根据商品类别查询商品列表等。
    • 聚焦最频繁查询:优先为最频繁执行的查询创建索引。对于电商系统,可能根据用户ID查询订单的操作会很频繁。
    • 覆盖索引:尽量创建覆盖索引,即索引包含查询所需的所有列,这样查询时可以直接从索引获取数据,避免回表操作,提高查询效率。
    • 避免冗余索引:冗余索引是指多个索引的前缀列相同,后面的列是其他索引的子集。例如,如果已经有了索引idx_userid_orderid (user_id, order_id),就不需要再创建单独的索引idx_userid (user_id),除非有特殊需求。
  2. 结合具体SQL语句说明
    • 根据用户ID查询其所有订单
      • SQL语句
SELECT * FROM orders WHERE user_id =?;
 - **索引设计**:创建索引idx_userid ON orders (user_id)。这里只需要在orders表的user_id列上创建索引,就可以满足此查询需求,避免了冗余。因为此查询仅依赖user_id列来筛选数据。
  • 根据订单ID查询订单详情(涉及订单与商品关联)
    • SQL语句
SELECT o.order_id, o.order_date, p.product_name, p.price
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_id =?;
 - **索引设计**:
   - 在orders表上创建索引idx_orderid ON orders (order_id),用于快速定位订单。
   - 在order_items表上创建索引idx_orderid_productid ON order_items (order_id, product_id),一方面通过order_id快速定位订单对应的订单项,另一方面product_id列可以帮助快速关联到products表。
   - 在products表上创建索引idx_productid ON products (product_id),用于快速获取商品信息。这样的索引设计既满足了查询需求,又避免了冗余,因为每个索引都有其特定的用途,且没有重复功能的索引。
  • 根据商品类别查询商品列表
    • SQL语句
SELECT * FROM products WHERE category =?;
 - **索引设计**:在products表上创建索引idx_category ON products (category)。此索引能够快速筛选出特定类别的商品,满足查询需求,且与其他索引不存在冗余。