面试题答案
一键面试优化思路
- 索引创建
- 在
orders
表的order_status
列上创建索引,用于快速筛选出状态为已完成的订单。
CREATE INDEX idx_order_status ON orders (order_status);
- 在
order_details
表的order_id
列上创建索引,方便关联orders
表。
CREATE INDEX idx_order_id ON order_details (order_id);
- 在
order_details
表的product_id
列上创建索引,便于筛选出购买特定产品的记录。
CREATE INDEX idx_product_id ON order_details (product_id);
- 在
products
表的product_name
列上创建索引,用于快速定位特定产品。
CREATE INDEX idx_product_name ON products (product_name);
- 在
- 查询语句改写
- 尽量避免子查询嵌套,可使用 JOIN 操作来替代。
SELECT DISTINCT users.user_name FROM users JOIN orders ON users.user_id = orders.user_id JOIN order_details ON orders.order_id = order_details.order_id JOIN products ON order_details.product_id = products.product_id WHERE orders.order_status = '已完成' AND products.product_name = 'ProductX';
- 执行计划分析
- 使用
EXPLAIN
关键字分析查询语句的执行计划。
EXPLAIN SELECT DISTINCT users.user_name FROM users JOIN orders ON users.user_id = orders.user_id JOIN order_details ON orders.order_id = order_details.order_id JOIN products ON order_details.product_id = products.product_id WHERE orders.order_status = '已完成' AND products.product_name = 'ProductX';
- 查看执行计划中的
type
字段,确保尽可能多的表连接类型为index
或eq_ref
,以提高查询性能。如果某些表连接类型不理想,进一步调整索引或查询语句。 - 关注
Extra
字段,查看是否有Using temporary
或Using filesort
等信息。若出现Using temporary
,意味着查询过程中创建了临时表,可能会影响性能,需要优化查询语句避免这种情况;若出现Using filesort
,表示进行了文件排序,可通过调整索引来避免不必要的排序操作。
- 使用