MySQL存儲數(shù)據(jù)時,分區(qū)分塊可以提高查詢和管理效率。分區(qū)是將表拆分為若干個分區(qū),每個分區(qū)獨(dú)立存儲數(shù)據(jù),可根據(jù)分區(qū)條件進(jìn)行快速查詢;分塊是將分區(qū)再次拆分為若干個塊,每個塊存儲特定時間段的數(shù)據(jù),可根據(jù)時間條件進(jìn)行快速查詢。
按月分區(qū)、按天分塊是常用的分區(qū)分塊方式。按月分區(qū)可將表按月份劃分為若干個分區(qū),每個分區(qū)存儲該月份的數(shù)據(jù);按天分塊可將每個分區(qū)再次拆分為若干個塊,每個塊存儲該天的數(shù)據(jù)。
-- 按月分區(qū) CREATE TABLE `orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_no` varchar(20) NOT NULL COMMENT '訂單編號', `order_date` date NOT NULL COMMENT '下單日期', `customer_id` int(11) NOT NULL COMMENT '客戶編號', PRIMARY KEY (`id`,`order_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY RANGE(TO_DAYS(order_date)) ( PARTITION p202105 VALUES LESS THAN (TO_DAYS('2021-06-01')), PARTITION p202106 VALUES LESS THAN (TO_DAYS('2021-07-01')), PARTITION p202107 VALUES LESS THAN (TO_DAYS('2021-08-01')), PARTITION p202108 VALUES LESS THAN (TO_DAYS('2021-09-01')), PARTITION p202109 VALUES LESS THAN (TO_DAYS('2021-10-01')), PARTITION p202110 VALUES LESS THAN (TO_DAYS('2021-11-01')), PARTITION p202111 VALUES LESS THAN (TO_DAYS('2021-12-01')), PARTITION p202112 VALUES LESS THAN (TO_DAYS('2022-01-01')) ); -- 按天分塊 ALTER TABLE orders PARTITION BY HASH(TO_DAYS(order_date)) PARTITIONS 31;
以上代碼創(chuàng)建了一張名為orders的表,按月分區(qū)、按天分塊。按月分區(qū)使用RANGE方式,按下單日期按日生成每月一個分區(qū);按天分塊使用HASH方式,將每個分區(qū)再次拆分為31個塊,每個塊存儲一天的數(shù)據(jù)。