【MySql】mysql数据库表分区设计实现
原文链接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) #支付状态);
执行结果如下:
2、添加订单的索引为联合索引(需要修改为索引联合索引,不然后面会报错)
ALTER TABLE `order_payments` DROP PRIMARY KEY,ADD PRIMARY KEY (payment_id, order_id,payment_date);
执行结果如下:
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')) );
执行结果如下:
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
执行结果如下:
注意存储过程需要赋予权限,不然执行不了
最后执行存储过程执行一段时间,然后点击停止。
最后数据库数据如下图
5、查询分区数据插入情况
SELECT PARTITION_NAME, PARTITION_EXPRESSION, PARTITION_DESCRIPTION, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'order_payments';
这里就是每一个分区的数据量

如下图
猜你喜欢
- 【MySql】批量替换数据表中某字段的值
- 系统域名变更,需要把数据库存储的图片、文件等链接域名也替换掉,使用了文字替换的方法,在此记录一下:数据库:mysqlUPDATE user SET headimg = REPLACE(headimg, 'a.com', 'b.com');其中 user 是数据表,headimg是其中的字段,把headimg中'a.com'全部替换成'b.com',headimg中
- 【MySQL】库操作
- 第二篇:库操作#一、系统数据库#1.information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列表息、权限信息、字符信息等 2.mysql:核心数据库,里面包含用户、权限、关键字等信息。不可以删除 3.performance_schema:mysql 5.5 版本后添加的新库,主要收集系统性能参数,记录处理查询请求时发生的各种事件、锁等现象 4.sys:mysql5.7 版本新增加的库,通过这个库可
- 【MySql】select * 查询慢的原因和优化方法
- ‌使用SELECT *查询语句会导致查询效率低下的原因主要包括‌:它会查询所有的列和行数据,包括不需要的和重复的列,因此会占用更多的系统资源,导致查询效率低下。此外,由于...
- 【MySQL】MySQL中的json操作
- 引言Mysql5.7版本以后提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。 在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。 Json文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, <, <=, >, >=, <>, != 和 <=>。
- 【MySQL】MySql中的锁(表锁,行锁)
- 锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。My
- 【MySql】where和having的异同?
- 文章目录面试常考:where与having有什么不同?一个实际查询需求wherehaving怎么正确的使用where和having?面试常考:where与having有什么不同?我们在进行查询的时候,经常需要按照条件对查询结果进行筛选,这就要用到条件语句where和having了。where是直接对表中的字段进行限定来筛选结果,having则需要跟分组关键字group by一起使用,通过对分组字段或分组计算函数进行限定来筛选结果。虽然它们都是对查询进行限定,却有着各自的特点和适用场景。很多时候,
- 【MySQL】表操作
- 第三篇:表操作#一、什么是表#表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段二、创建表#语法CREATE TABLE 表名( 字段名1 类型[(宽度)约束条件], 字段名1 类型[(宽度)约束条件], 字段名1 类型[(宽度)约束条件] )ENGINE=innodb DEFAULT CHARSET utf8; create
- 【MySql】MySql给数据库表添加新字段
- 要在MySQL中添加新字段,您可以使用ALTER TABLE语句。以下是添加新字段的基本语法:ALTER TABLE table_name ADD column_name datatype;其中:table_name 是您要在其中添加新字段的表的名称。column_name 是新字段的名称。datatype 是新字段的数据类型。例如,VARCHAR、INT或DOUBLE等。以下是一个示例ALTER TABLE语句,演示如何向名为user的表添加一