1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| CREATE TABLE orders_monthly ( id BIGINT AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL UNIQUE, user_id INT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL DEFAULT 1, unit_price DECIMAL(10,2) NOT NULL, total_amount DECIMAL(10,2) NOT NULL, order_status TINYINT NOT NULL DEFAULT 1, payment_method VARCHAR(20), shipping_address TEXT, order_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, payment_time TIMESTAMP NULL, shipping_time TIMESTAMP NULL, completed_time TIMESTAMP NULL, PRIMARY KEY (id, order_time), UNIQUE KEY uk_order_no_time (order_no, order_time), INDEX idx_user_order_time (user_id, order_time), INDEX idx_status_time (order_status, order_time), INDEX idx_product_time (product_id, order_time) ) PARTITION BY RANGE (YEAR(order_time) * 100 + MONTH(order_time)) ( PARTITION p202301 VALUES LESS THAN (202302), PARTITION p202302 VALUES LESS THAN (202303), PARTITION p202303 VALUES LESS THAN (202304), PARTITION p202304 VALUES LESS THAN (202305), PARTITION p202305 VALUES LESS THAN (202306), PARTITION p202306 VALUES LESS THAN (202307), PARTITION p202307 VALUES LESS THAN (202308), PARTITION p202308 VALUES LESS THAN (202309), PARTITION p202309 VALUES LESS THAN (202310), PARTITION p202310 VALUES LESS THAN (202311), PARTITION p202311 VALUES LESS THAN (202312), PARTITION p202312 VALUES LESS THAN (202401), PARTITION p_future VALUES LESS THAN MAXVALUE );
CREATE TABLE order_details_composite ( id BIGINT AUTO_INCREMENT, order_id BIGINT NOT NULL, product_id INT NOT NULL, product_name VARCHAR(200) NOT NULL, sku VARCHAR(50), quantity INT NOT NULL, unit_price DECIMAL(10,2) NOT NULL, discount_amount DECIMAL(10,2) DEFAULT 0, total_price DECIMAL(10,2) NOT NULL, order_time TIMESTAMP NOT NULL, PRIMARY KEY (id, order_time, order_id), INDEX idx_order_id (order_id), INDEX idx_product_id (product_id), INDEX idx_sku (sku) ) PARTITION BY RANGE (YEAR(order_time)) SUBPARTITION BY HASH(order_id) SUBPARTITIONS 4 ( PARTITION p2022 VALUES LESS THAN (2023), PARTITION p2023 VALUES LESS THAN (2024), PARTITION p2024 VALUES LESS THAN (2025), PARTITION p_future VALUES LESS THAN MAXVALUE );
INSERT INTO orders_monthly ( order_no, user_id, product_id, quantity, unit_price, total_amount, order_status, payment_method, order_time ) VALUES ('ORD202308001', 1001, 2001, 2, 99.99, 199.98, 2, 'alipay', '2023-08-01 10:30:00'), ('ORD202308002', 1002, 2002, 1, 299.00, 299.00, 1, 'wechat', '2023-08-15 14:20:00'), ('ORD202309001', 1003, 2003, 3, 49.99, 149.97, 3, 'credit_card', '2023-09-05 09:15:00'), ('ORD202309002', 1004, 2004, 1, 599.00, 599.00, 2, 'alipay', '2023-09-20 16:45:00');
EXPLAIN PARTITIONS SELECT order_no, user_id, total_amount, order_status, order_time FROM orders_monthly WHERE order_time >= '2023-08-01 00:00:00' AND order_time < '2023-09-01 00:00:00' AND order_status = 2;
SELECT PARTITION_NAME as '分区名', TABLE_ROWS as '行数', ROUND(DATA_LENGTH/1024/1024, 2) as '数据大小MB', ROUND(INDEX_LENGTH/1024/1024, 2) as '索引大小MB', ROUND((DATA_LENGTH + INDEX_LENGTH)/1024/1024, 2) as '总大小MB' FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'orders_monthly' AND PARTITION_NAME IS NOT NULL ORDER BY PARTITION_ORDINAL_POSITION;
|