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