MySQL 分区表是将一个大表在物理上分割成多个较小的部分,但在逻辑上仍然表现为一个完整的表。对于订单数据这类随时间增长的表,分区可以显著提高查询性能。
CREATE TABLE orders (
order_id INT NOT NULL,
order_date DATETIME NOT NULL,
customer_id INT NOT NULL,
amount DECIMAL(10,2),
-- 其他字段...
PRIMARY KEY (order_id, order_date)
) PARTITION BY RANGE (YEAR(order_date)*100 + MONTH(order_date)) (
PARTITION p_202301 VALUES LESS THAN (202302),
PARTITION p_202302 VALUES LESS THAN (202303),
PARTITION p_202303 VALUES LESS THAN (202304),
PARTITION p_max VALUES LESS THAN MAXVALUE
);
优点: - 适合按时间范围查询订单的场景 - 可以轻松删除或归档旧数据
CREATE TABLE orders (
order_id INT NOT NULL,
customer_id INT NOT NULL,
order_date DATETIME NOT NULL,
amount DECIMAL(10,2),
-- 其他字段...
PRIMARY KEY (order_id)
) PARTITION BY HASH (customer_id)
PARTITIONS 8;
优点: - 均匀分布数据 - 适合按客户ID查询的场景
SELECT * FROM orders PARTITION (p_202301)
WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';
利用分区裁剪: MySQL 会自动识别 WHERE 条件中的分区键,只扫描相关分区。
定期维护分区:
-- 添加新分区
ALTER TABLE orders ADD PARTITION (
PARTITION p_202304 VALUES LESS THAN (202305)
);
-- 删除旧分区
ALTER TABLE orders DROP PARTITION p_202201;
-- 查看分区使用情况
EXPLAIN PARTITIONS SELECT * FROM orders WHERE order_date > '2023-01-01';
-- 查看分区统计信息
SELECT * FROM information_schema.PARTITIONS
WHERE TABLE_NAME = 'orders';
通过合理设计分区策略并结合适当的索引,可以显著提升大型订单表的查询性能,特别是对于时间序列数据的查询。