MST
星途 面试题库

面试题:MySQL 中分区表在大数据量查询里如何提升性能

请阐述 MySQL 分区表的常见分区类型,以及在大数据量查询场景下,每种分区类型是如何通过减少数据扫描范围来提升查询性能的,并举例说明。
24.6万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

常见分区类型及提升查询性能原理与示例

  1. 范围分区
    • 原理:按某列的值的范围进行分区,查询时,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)
    );
    
  2. 列表分区
    • 原理:按某列的离散值进行分区,查询时,根据查询条件中的值确定需要扫描的分区,从而减少数据扫描量。
    • 示例:假设 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 ('广东', '福建', '广西')
    );
    
  3. 哈希分区
    • 原理:通过对某列(通常是主键或唯一键)进行哈希运算,将数据均匀分布到不同分区。查询时,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;
    
  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;