• MySQL中分区与分表的区别


    MySQL中分区与分表的区别

    在这里插入图片描述

    一、分区与分表的区别

    分区和分表是在处理大规模数据时的两种技术手段,尽管它们的目标都是提升系统的性能和数据管理的效率,但它们的实现方式和应用场景略有不同。

    1. 分区

    分区是将一个大表分割为多个更小的子表,每个子表被称为一个分区。分区可以根据数据的范围、列表或哈希等方式进行划分,并将数据分布在不同的分区中。分区可以提高查询性能、减少索引大小、提高数据可靠性等。

    分区适合处理数据量大、查询频繁的情况,特别是那些基于时间范围进行查询的场景,如日志表、交易表等。另外,分区还可以简化数据的维护和备份操作。

    2. 分表

    分表是将一个大表分割为多个独立的表,每个表都具有相同的结构。每个分表存储部分数据,使得查询和维护更加高效。分表可以按照数据的某种规则进行划分,如根据地域、品类等进行分表。

    分表适用于数据量巨大且需要横向扩展的场景,可以有效减轻单表的负荷和加速查询操作。但需要注意的是在使用分表时,需要进行跨表查询和数据合并操作。

    以下是分区和分表的区别的对照表格形式

    分区分表
    定义将一个大表分割为多个子表将一个大表拆分为多个独立的表
    数据存储数据按照规则存放在不同的分区中数据根据规则分配到不同的表中
    数据管理操作整个表,无需考虑具体分区的细节操作单个表,需跨表查询和数据合并
    查询性能提高查询性能,可以仅查询特定分区查询性能相对较高,单个表规模较小
    索引大小索引仅适用于特定分区,索引相对较小索引适用于整个表,索引相对较大
    数据维护数据维护相对简单,可以单独备份和优化需要跨表操作,复杂度较高
    适用场景数据量大、查询频繁,基于时间范围进行查询数据量巨大、横向扩展需求

    二、MySQL中的分区语法与案例

    MySQL提供了丰富的分区语法,可以根据不同的划分方式进行分区。下面以根据范围划分为例,介绍MySQL中的分区语法和一个具体案例:

    1. 分区语法
    • 创建分区表的语法:
         CREATE TABLE table_name (
             column1 data_type,
             column2 data_type,
             ...
         )
         PARTITION BY RANGE(column_name) (
             PARTITION partition_name1 VALUES LESS THAN (value1),
             PARTITION partition_name2 VALUES LESS THAN (value2),
             ...
         );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 构建分区(给已经创建好的表):
    	ALTER TABLE table_name
    	PARTITION BY RANGE(column_name) (
    	    PARTITION partition_name1 VALUES LESS THAN (value1),
    	    PARTITION partition_name2 VALUES LESS THAN (value2),
    	    ...
    	);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 按照每月31天进行分区:
    	ALTER TABLE table_name
    	PARTITION BY RANGE(DAY(created_time)) (
    	    PARTITION p1 VALUES LESS THAN (11),
    	    PARTITION p2 VALUES LESS THAN (21),
    	    PARTITION p3 VALUES LESS THAN (32)
    	);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 根据ID取模进行分区
    	ALTER TABLE table_name 
    	PARTITION BY HASH(id) PARTITIONS 4;
    
    • 1
    • 2
    • 添加分区的语法:
         ALTER TABLE table_name
         ADD PARTITION (
             PARTITION partition_name VALUES LESS THAN (value)
         );
    
    • 1
    • 2
    • 3
    • 4
    • 移除分区的语法:
         ALTER TABLE table_name
         DROP PARTITION partition_name;
    
    • 1
    • 2
    • 移除所有分区语法:
    	ALTER TABLE table_name
    	REMOVE PARTITIONING;
    
    • 1
    • 2
    • 验证分区是否成功创建:
        SHOW CREATE TABLE table_name;
    
    • 1
    2. 分区案例

    假设有一张名称为sales的表,用于存储销售数据,我们可以按照年份将表进行分区。

    • 创建分区表的语句:
         CREATE TABLE sales (
             sale_id INT,
             product_name VARCHAR(50),
             sale_date DATE
         )
         PARTITION BY RANGE(YEAR(sale_date)) (
             PARTITION p0 VALUES LESS THAN (2015),
             PARTITION p1 VALUES LESS THAN (2020),
             PARTITION p2 VALUES LESS THAN (MAXVALUE)
         );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 添加分区的语句:
         ALTER TABLE sales
         ADD PARTITION (
             PARTITION p3 VALUES LESS THAN (2025)
         );
    
    • 1
    • 2
    • 3
    • 4
    • 移除分区的语句:
         ALTER TABLE sales
         DROP PARTITION p2;
    
    • 1
    • 2

    通过以上分区语法和分区案例,可以灵活地对表进行分区操作,提高数据库的性能和管理效率。

    常见问题

    1. A PRIMARY KEY must include all columns in the table’s partitioning function
      原因是:分区表的设计要求是,分区函数使用的列必须包含在表的主键中。这是因为,在分区时,MySQL需要确保数据在每个分区中的唯一性。通过将分区函数使用的列包含在主键中,确保了每个分区中的数据具有唯一的组合键。

    总结:

    分区与分表是MySQL中处理大规模数据的常用技术手段,它们的目标都是提升系统性能和数据管理效率。然而,分区是将一个大表划分为多个子表,而分表是将一个大表拆分为多个独立的表。在具体的实践中,根据数据的不同属性和需求,选择合适的技术手段对数据进行分割和管理,以满足业务的需求和系统的性能要求。

  • 相关阅读:
    刷题学习记录
    Vue:element-ui中表格过长内容隐藏显示
    一文看懂推荐系统:召回07:双塔模型——正负样本的选择,召回的目的是区分感兴趣和不感兴趣的,精排是区分感兴趣和非常感兴趣的
    SpringBoot 实现EMQ设备的上下线告警
    场景分析(删除文件夹下七天前的文件)
    不就是Java吗 之 接口
    Leetcode Hot 100之四:283. 移动零+11. 盛最多水的容器
    windos安装Mysql8.0,及解决重新登录异常问题 ERROR 1045 (28000)
    STM32CUBEMX_创建时间片轮询架构的软件框架
    Java运算符
  • 原文地址:https://blog.csdn.net/weixin_45626288/article/details/132725349