#码力全开·技术π对#如何优化一个执行缓慢的 MySQL 查询?

我在生产环境中有一个执行很慢的查询,查询一个包含百万级记录的表,响应时间超过5秒。表结构如下:

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT NOT NULL,
    order_date DATETIME NOT NULL,
    amount DECIMAL(10,2),
    status VARCHAR(20),
    INDEX idx_customer (customer_id)
);

查询语句是:

SELECT * FROM orders 
WHERE customer_id = 12345 
AND order_date BETWEEN '2023-01-01' AND '2023-12-31'
ORDER BY order_date DESC;

请问应该如何优化这个查询?

mysql
最多选5个技能
2025-04-30 15:14:57
浏览
已于2025-5-27 18:27:52修改
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
最多选5个技能
最多选5个技能

这个问题有几个优化方向:

  1. 添加复合索引:当前只有customer_id的单列索引,可以创建(customer_id, order_date)的复合索引
ALTER TABLE orders ADD
  1. 只查询必要字段:避免使用SELECT *,只查询需要的字段
SELECT id, order_date, amount, status FROM orders 
WHERE customer_id = 12345 
AND order_date BETWEEN '2023-01-01' AND '2023-12-31'
ORDER BY order_date DESC;
  1. 使用EXPLAIN分析:查看执行计划确认索引使用情况
EXPLAIN SELECT * FROM orders 
WHERE customer_id = 12345 
AND order_date BETWEEN '2023-01-01' AND '2023-12-31'
ORDER BY order_date DESC;
  1. 考虑分页:如果结果集很大,添加LIMIT分页
SELECT * FROM orders 
WHERE customer_id = 12345 
AND order_date BETWEEN '2023-01-01' AND '2023-12-31'
ORDER BY order_date DESC
LIMIT 20 OFFSET 0;
  1. 表分区:如果数据量持续增长,考虑按时间范围分区
ALTER TABLE orders PARTITION BY RANGE (YEAR(order_date)) (
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION pmax VALUES

实施复合索引后,查询性能通常会有显著提升,因为MySQL可以高效地定位特定客户在特定时间范围内的订单,并且排序操作可以利用索引的有序性。

分享
微博
QQ
微信https://www.51cto.com/aigc/
回复
2025-04-30 15:15:16
发布
相关问题
提问