MST

星途 面试题库

面试题:MySQL WHERE子句高级优化问题

假设有一个复杂的电商订单系统数据库,包含 `orders` 表(订单表,有字段 `order_id`、`customer_id`、`order_date`、`total_amount` 等),`order_items` 表(订单项表,有字段 `item_id`、`order_id`、`product_id`、`quantity`、`price` 等),`products` 表(产品表,有字段 `product_id`、`product_name`、`category` 等)。现在要查询2023年11月所有订单中,购买了电子产品类(`category` 为 'electronics')产品且订单总金额大于1000的订单信息,如何编写高效的 `WHERE` 子句并阐述优化思路?
45.9万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

SQL查询语句

SELECT o.order_id, o.customer_id, o.order_date, o.total_amount
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_date >= '2023-11-01'
  AND o.order_date < '2023-12-01'
  AND p.category = 'electronics'
  AND o.total_amount > 1000;

优化思路

  1. 索引优化
    • orders 表的 order_datetotal_amount 字段上创建复合索引。这可以加速 WHERE 子句中对 order_datetotal_amount 的条件过滤。例如:CREATE INDEX idx_order_date_amount ON orders (order_date, total_amount);
    • products 表的 category 字段上创建索引。这样能快速定位到 category 为 'electronics' 的产品记录。即:CREATE INDEX idx_product_category ON products (category);
    • order_items 表的 order_idproduct_id 字段上创建索引,以加快连接操作。可使用:CREATE INDEX idx_order_items ON order_items (order_id, product_id);
  2. 查询结构优化
    • 合理安排连接顺序。从 orders 表开始连接,因为日期范围过滤可以快速减少数据集,然后连接 order_items 表和 products 表,这样可以避免不必要的数据扫描。
  3. 数据库配置优化
    • 适当调整数据库的缓存参数,使经常查询的数据能缓存到内存中,减少磁盘I/O操作,提高查询性能。