在 MySQL 中,當數據量達到一定程度時,大表將會成為數據庫的性能瓶頸。為了解決這個問題,MySQL 提供了分區表和分表的功能。下面分別介紹這兩種分擔表的功能。
1. MySQL 分區表
MySQL 分區表是指將大表的數據根據某個規則,分別存放在不同的分區中。這樣可以達到快速查詢和快速刪除等效果。對于大型的數據倉庫和數據統計,分區表是非常有用的。
創建分區表需要指定分區鍵(partition key),分區鍵可以是整型、日期、枚舉類型等。在分區鍵的基礎上,可以指定分區方式(partitioning method),比如 RANGE, LIST, HASH 等。
CREATE TABLE `t_orders` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`order_time` datetime NOT NULL,
`status` tinyint(3) unsigned NOT NULL DEFAULT '0',
`amount` decimal(11,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`,`order_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
PARTITION BY RANGE( YEAR(order_time) )
(
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 p2024 VALUES LESS THAN MAXVALUE
);
2. MySQL 分表
MySQL 分表是指將大表拆分為多個小表,每個小表只包含部分數據。這樣可以提高查詢效率,同時降低鎖定表的概率,減少數據沖突。
有幾種分表的方式,比如按照時間、按照地理位置等。下面是按照時間進行分表的一個例子:
CREATE TABLE `t_orders_2018` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`order_time` datetime NOT NULL,
`status` tinyint(3) unsigned NOT NULL DEFAULT '0',
`amount` decimal(11,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`,`order_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `t_orders_2019` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`order_time` datetime NOT NULL,
`status` tinyint(3) unsigned NOT NULL DEFAULT '0',
`amount` decimal(11,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`,`order_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `t_orders_2020` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`order_time` datetime NOT NULL,
`status` tinyint(3) unsigned NOT NULL DEFAULT '0',
`amount` decimal(11,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`,`order_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
分表的缺點是需要對表名進行修改,同時對于跨表的查詢會比較麻煩。
下一篇mysql卷子