面试题答案
一键面试常见分区类型及提升查询性能原理与示例
- 范围分区
- 原理:按某列的值的范围进行分区,查询时,MySQL 可以快速定位到符合条件的分区,只扫描这些分区的数据,减少不必要的数据扫描。
- 示例:假设有一个订单表
orders
,包含订单日期order_date
字段。以日期范围进行分区,比如每月一个分区。如果查询 2023 年 10 月的订单,MySQL 直接定位到 2023 - 10 对应的分区进行扫描,而无需扫描其他月份的分区数据。
CREATE TABLE orders ( id INT, order_date DATE, amount DECIMAL(10, 2) ) PARTITION BY RANGE (YEAR(order_date) * 100 + MONTH(order_date)) ( PARTITION p0 VALUES LESS THAN (202310), PARTITION p1 VALUES LESS THAN (202311), PARTITION p2 VALUES LESS THAN (202312) );
- 列表分区
- 原理:按某列的离散值进行分区,查询时,根据查询条件中的值确定需要扫描的分区,从而减少数据扫描量。
- 示例:假设
orders
表中有一个region
字段表示订单地区。按地区列表进行分区,比如分为华北、华东、华南等分区。若查询华东地区的订单,MySQL 只扫描华东地区对应的分区。
CREATE TABLE orders ( id INT, region VARCHAR(50), amount DECIMAL(10, 2) ) PARTITION BY LIST (region) ( PARTITION p_north VALUES IN ('北京', '天津', '河北'), PARTITION p_east VALUES IN ('上海', '江苏', '浙江'), PARTITION p_south VALUES IN ('广东', '福建', '广西') );
- 哈希分区
- 原理:通过对某列(通常是主键或唯一键)进行哈希运算,将数据均匀分布到不同分区。查询时,MySQL 根据哈希值直接定位到对应的分区,减少全表扫描。
- 示例:对于
orders
表,以id
字段进行哈希分区。例如分为 4 个分区,id
值经过哈希函数计算后,均匀分布到 4 个分区中。当查询id = 100
的订单时,MySQL 通过哈希函数确定其所在分区进行扫描。
CREATE TABLE orders ( id INT, order_date DATE, amount DECIMAL(10, 2) ) PARTITION BY HASH (id) PARTITIONS 4;
- 键分区
- 原理:与哈希分区类似,不过键分区使用 MySQL 提供的键函数,而不是用户自定义的哈希函数。数据根据键函数的计算结果均匀分布到各个分区,查询时快速定位到对应分区。
- 示例:同样对于
orders
表,以id
字段进行键分区。假设分为 3 个分区,id
值经过 MySQL 键函数计算后,分布到不同分区。查询特定id
的订单时,只扫描该id
对应的分区。
CREATE TABLE orders ( id INT, order_date DATE, amount DECIMAL(10, 2) ) PARTITION BY KEY (id) PARTITIONS 3;