您的当前位置:首页>全部文章>文章详情

【MySql】mysql数据库表分区设计实现

CrazyPanda发表于:2024-07-16 10:37:09浏览:375次TAG:

原文链接https://blog.csdn.net/weixin_45377154/article/details/135285902

文章目录



前言

数据库单表数据量不断增大,设计表分区来提高数据库的查询效率。

一、什么是mysql表分区?

mysql表分区是将一个大表拆分成更小的,可管理的部分的技术,通过将数据分布在多个分区中,可以提高查询性能,简化备份和恢复操作,并允许更有效的处理大量数据。
表分区可以根据不同的条件进行分割,例如按范围、列表、哈希或者键值分区。每个分区都类似于独立的子表,具有自己的存储结构和索引,这意味着可以根据查询的条件搜索特定分区,而不必要扫描政整个表。
使用表分区的好处:
1、查询性能提升:分区可以使得查询只针对特定的分区进行,从而减少了需要扫描的数据量,提高了查询效率。
2、管理简化:可以更加轻松的管理较小的分区,包括备份、恢复、数据加载和删除等操作,此外,还可以更方便地执行维护操作,如优化索引,重建分区等
3、数据保护和容错:通过将数据分散在多个分区中,即使某个分区发生故障,也可以保留其它分区数据的完整性和可用性
4、存储效率提升:可以将不同分区设置为不同的存储介质,例如将历史数据存储在较慢的磁盘上,而将当前数据存储在更快的固态驱动器上,从而提高存储效率
需要注意的是,表分区功能在MySQL的某些版本和存储引擎中有一些限制和差异,因此在使用表分区之前,请确保你的MySQL版本和存储引擎支持所需的分区功能。

二、表分区有哪几种方案? 如何实现

2.1 范围分区(Range Partitioning)

适合场景:

1、创建订单表

CREATE TABLE order_payments (
    payment_id INT PRIMARY KEY, #支付编号
    order_id INT, #订单编号
    payment_date DATETIME, #支付日期
    payment_amount DECIMAL(10, 2), #支付金额
    payment_method VARCHAR(50), #支付方式
    card_number VARCHAR(50), #信用卡号码
    card_expiry_date DATETIME, #信用卡到期日期
    payment_status VARCHAR(20) #支付状态);

执行结果如下:
1.png

2、添加订单的索引为联合索引(需要修改为索引联合索引,不然后面会报错)

ALTER TABLE `order_payments` DROP PRIMARY KEY,ADD PRIMARY KEY (payment_id, order_id,payment_date);

执行结果如下:
1.png

3、按照订单时间范围来分区

ALTER TABLE order_payments
PARTITION BY RANGE(TO_SECONDS(payment_date))
(
  PARTITION p2023q1 VALUES LESS THAN (TO_SECONDS('2023-04-01 00:00:00')),
  PARTITION p2023q2 VALUES LESS THAN (TO_SECONDS('2023-07-01 00:00:00')),
  PARTITION p2023q3 VALUES LESS THAN (TO_SECONDS('2023-10-01 00:00:00')),
  PARTITION p2023q4 VALUES LESS THAN (TO_SECONDS('2024-01-01 00:00:00')),
  PARTITION p2024q1 VALUES LESS THAN (TO_SECONDS('2024-04-01 00:00:00')),
  PARTITION p2024q2 VALUES LESS THAN (TO_SECONDS('2024-07-01 00:00:00')),
  PARTITION p2024q3 VALUES LESS THAN (TO_SECONDS('2024-10-01 00:00:00')),
  PARTITION p2024q4 VALUES LESS THAN (TO_SECONDS('2025-01-01 00:00:00'))
);

执行结果如下:
1.png

4、向数据库插入数据(创建存储过程,循环插入2023到2025年的数据,数据时间间隔为半个小时1次)

备注:这一步也可以自行造2023年到2024年的数据测试

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_data`()
BEGIN
    DECLARE start_date DATETIME DEFAULT '2023-01-01 00:00:00';
    DECLARE end_date DATETIME DEFAULT '2025-01-01 00:00:00';
    DECLARE order_id INT DEFAULT 1;
    DECLARE payment_id INT;
    DECLARE payment_date DATETIME;

    SET payment_id = (order_id * 10) + 1;

    WHILE order_id <= 10000 DO
        SET payment_date = start_date;

        WHILE payment_date < end_date DO
            INSERT INTO test.order_payments (payment_id, order_id, payment_date, payment_amount, payment_method, card_number, card_expiry_date, payment_status)
            VALUES (payment_id, order_id, payment_date, RAND() * 1000, 'Credit Card', CONCAT('**** **** **** ', RIGHT(CAST(FLOOR(RAND() * POWER(10, 16)) AS CHAR), 4)), DATE_ADD(payment_date, INTERVAL 30 MINUTE), 'Paid');

            SET payment_id = payment_id + 1;
            SET payment_date = DATE_ADD(payment_date, INTERVAL 30 MINUTE);
        END WHILE;

        SET order_id = order_id + 1;
    END WHILE;
END

执行结果如下:
1.png
注意存储过程需要赋予权限,不然执行不了
1.png
最后执行存储过程执行一段时间,然后点击停止。
1.png

最后数据库数据如下图
1.png

5、查询分区数据插入情况

 SELECT PARTITION_NAME, PARTITION_EXPRESSION, PARTITION_DESCRIPTION, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'order_payments';

这里就是每一个分区的数据量
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e337fb951804428a8e861e664bf060a1.png1.png

6、根据分区查询数据

#只查询2023年三季度的数据

select * from order_payments partition(p2023q3)

如下图
1.png

猜你喜欢

【MySql】批量替换数据表中某字段的值
系统域名变更,需要把数据库存储的图片、文件等链接域名也替换掉,使用了文字替换的方法,在此记录一下:数据库:mysqlUPDATE&nbsp;user&nbsp;SET&nbsp;headimg&nbsp;=&nbsp;REPLACE(headimg,&nbsp;&#39;a.com&#39;,&nbsp;&#39;b.com&#39;);其中 user 是数据表,headimg是其中的字段,把headimg中&#39;a.com&#39;全部替换成&#39;b.com&#39;,headimg中
发表于:2024-04-02 浏览:328 TAG:
【MySQL】库操作
第二篇:库操作#一、系统数据库#1.information_schema&nbsp;:虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列表息、权限信息、字符信息等 2.mysql:核心数据库,里面包含用户、权限、关键字等信息。不可以删除 3.performance_schema:mysql&nbsp;5.5&nbsp;版本后添加的新库,主要收集系统性能参数,记录处理查询请求时发生的各种事件、锁等现象 4.sys:mysql5.7&nbsp;版本新增加的库,通过这个库可
发表于:2024-06-21 浏览:384 TAG: #mysql
【MySql】select * 查询慢的原因和优化方法
&zwnj;使用SELECT&nbsp;*查询语句会导致查询效率低下的原因主要包括&zwnj;:它会查询所有的列和行数据,包括不需要的和重复的列,因此会占用更多的系统资源,导致查询效率低下。此外,由于...
发表于:2024-10-21 浏览:271 TAG: #mysql
【MySQL】MySQL中的json操作
引言Mysql5.7版本以后提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。 在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。 Json文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, &lt;, &lt;=, &gt;, &gt;=, &lt;&gt;, != 和 &lt;=&gt;。
发表于:2024-07-26 浏览:246 TAG:
【MySQL】MySql中的锁(表锁,行锁)
&nbsp; &nbsp; 锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。&nbsp;概述&nbsp; &nbsp; 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。My
发表于:2024-06-16 浏览:233 TAG:
【MySql】where和having的异同?
文章目录面试常考:where与having有什么不同?一个实际查询需求wherehaving怎么正确的使用where和having?面试常考:where与having有什么不同?我们在进行查询的时候,经常需要按照条件对查询结果进行筛选,这就要用到条件语句where和having了。where是直接对表中的字段进行限定来筛选结果,having则需要跟分组关键字group by一起使用,通过对分组字段或分组计算函数进行限定来筛选结果。虽然它们都是对查询进行限定,却有着各自的特点和适用场景。很多时候,
发表于:2023-12-08 浏览:392 TAG:
【MySQL】表操作
第三篇:表操作#一、什么是表#表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段二、创建表#语法CREATE&nbsp;TABLE&nbsp;表名( 字段名1&nbsp;&nbsp;类型[(宽度)约束条件], 字段名1&nbsp;&nbsp;类型[(宽度)约束条件], 字段名1&nbsp;&nbsp;类型[(宽度)约束条件] )ENGINE=innodb&nbsp;DEFAULT&nbsp;CHARSET&nbsp;utf8; create
发表于:2024-06-21 浏览:272 TAG: #mysql
【MySql】MySql给数据库表添加新字段
要在MySQL中添加新字段,您可以使用ALTER TABLE语句。以下是添加新字段的基本语法:ALTER&nbsp;TABLE&nbsp;table_name&nbsp;ADD&nbsp;column_name&nbsp;datatype;其中:table_name 是您要在其中添加新字段的表的名称。column_name 是新字段的名称。datatype 是新字段的数据类型。例如,VARCHAR、INT或DOUBLE等。以下是一个示例ALTER TABLE语句,演示如何向名为user的表添加一
发表于:2024-09-03 浏览:241 TAG: #mysql
【MySQL】MySQL索引原理与慢查询优化
浏览目录#&nbsp;一、索引介绍二、索引方法三、索引类型四、聚合索引和辅助索引五、测试索引六、正确使用索引七、组合索引八、注意事项九、查询计划十、慢日志查询十一、大数据量分页优化一、索引介绍#  一般的应用系统,读写的比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出现问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。什么是索引:简单来说,相当于图书的目录,可以帮助用户快速找到需要的内容。&nbsp;  在mysql中
发表于:2024-06-21 浏览:374 TAG:
【MySql】MySQL备份与恢复全面指南
MySQL是目前最流行的关系型数据库管理系统之一,在企业级应用中被广泛使用。无论是开发者还是数据管理员,都需要了解MySQL备份与恢复的基本知识。备份和恢复不仅能够帮助企业保护数据,还能够使系统在不良情况下快速应对,尽可能使其恢复到正常运行状态。本文将详细介绍MySQL备份与恢复的操作步骤,并提供一些最佳实践,以帮助读者在保护其MySQL数据库方面走得更远。一、MySQL备份MySQL备份应该频繁地进行,以确保数据库永远处于最新状态。备份可以分为两种类型:物理备份和逻辑备份。1.物理备份物理备份
发表于:2024-01-24 浏览:292 TAG: