首页 > 数据库 >mysql 分区表 partion

mysql 分区表 partion

时间:2023-08-01 15:32:54浏览次数:36  
标签:00 normal partion partition -- 分区表 mysql table

1.1. 场景

在每个系统中都会生成一些日志,往往有些日志都是需要记录的,比如:生成订单的过程的一些记录、某个账号活动的一些信息。这样一来每天生成的日志会很多,而且还会生成到数据库中。


像这些记录信息在某段时间过后就没用了。为了节省空间资源,和产品确认这些信息只保留3个月的。3个月之前的都可以删了。


1.2. 使用普通表记录这些数据

一般情况下大家都知道创建一些日志表存放这些数据,之后就在每个月初去删除三个月以前的日志记录(不管用手动人工执行删除或使用定时任务)。


这种方法看上去很可行的。当是,使用delete删除3月以前的数据,其实磁盘的空间是没有人减少的。懂得的人会去做Optimize、或者从新导入导出数据。可是像这种优化和导入导出的方法在数据量大的时候是很不可行的。因此,就会陷入尴尬的境地。


1.3. 使用partition table(分区表)

使用partition table的方法来存储这些数据就很有优势了。我们只要在每个月初创建下一个月的分区,在删除3月前的分区就好了。由于每个分区都是存储在不同的表空间文件中(这里使用的不是共享表空间模式)。所以在删除了分区之后空间会直接的释放出来。


提示:可以使用压缩比高的TokuDB引擎,该引擎的数据压缩会比原来的小5-10倍。



1.4. 使用普通表和partition table对比演示


--创建测试使用数据库
CREATE DATABASE test_partition ;


使用普通表的演示



USE test_partition ;
--创建非 partition表
CREATE TABLE normal_table (
   id BIGINT NOT NULL AUTO_INCREMENT ,
   name VARCHAR ( 50 ) NOT NULL ,
   context VARCHAR ( 50 ) NOT NULL ,
   create_time DATETIME NOT NULL ,
   PRIMARY KEY ( id )
) ;
--构造和月份有关的数据
INSERT INTO normal_table VALUES
   ( NULL , REPEAT ( 'x' , 50 ) , REPEAT ( 'y' , 50 ) , '2016-01-01 00:00:00' ) ,
   ( NULL , REPEAT ( 'x' , 50 ) , REPEAT ( 'y' , 50 ) , '2016-02-01 00:00:00' ) ,
   ( NULL , REPEAT ( 'x' , 50 ) , REPEAT ( 'y' , 50 ) , '2016-03-01 00:00:00' ) ;
 
DROP PROCEDURE insert_normal_table ;
DELIMITER //
CREATE PROCEDURE insert_normal_table ( )
BEGIN
   DECLARE i INT ;
   SET i = 0 ;
   WHILE i < 22 DO
       INSERT INTO normal_table
       SELECT NULL , name , context , create_time FROM normal_table ;
       SET i = i + 1 ;
   END WHILE ;
END //
DELIMITER ;
 
CALL insert_normal_table ( ) ;

查看normal_table表占用磁盘空间大小

ll - h
- rw - r -- -- - 1 mysql mysql 8.5K Apr    2 15 : 36 normal_table . frm
- rw - r -- -- - 1 mysql mysql 1.8G Apr    2 15 : 56 normal_table . ibd

上面可以看到表的数据是1.8G。这时候按需求我们删除前3月的数据(这里我们删除一月份的数据)



DELETE FROM normal_table WHERE create_time < '2016-02-01 00:00:00' ;

继续查看现在的磁盘空间


ll - h
- rw - r -- -- - 1 mysql mysql 8.5K Apr    2 15 : 36 normal_table . frm
- rw - r -- -- - 1 mysql mysql 1.8G Apr    2 16 : 01 normal_table . ibd

理想的情况下应该是normal_table.ibd文件的空间大小应该会减少才对,可是并不是想象的那样。它的空间大小还是不变的。


这时候你需要让空间稍稍的释放出来就需要使用优化表命令



OPTIMIZE TABLE normal_table ;
ll - h
- rw - r -- -- - 1 mysql mysql 8.5K Apr    2 16 : 35 normal_table . frm
- rw - r -- -- - 1 mysql mysql 1.4G Apr    2 16 : 36 normal_table . ibd

可以看到空间被释放出来了。


使用partition table



USE test_partition ;
--创建 partition表
CREATE TABLE partition_table (
   id BIGINT NOT NULL AUTO_INCREMENT ,
   name VARCHAR ( 50 ) NOT NULL ,
   context VARCHAR ( 50 ) NOT NULL ,
   create_time INT NOT NULL ,
   INDEX idx $ partition_table $ id ( id )
)
PARTITION BY RANGE ( create_time ) (
   PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP ( '2016-01-31 23:59:59' ) ) ,
   PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP ( '2016-02-29 23:59:59' ) ) ,
   PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP ( '2016-03-31 23:59:59' ) )
) ;
 
--创建数据
INSERT INTO partition_table VALUES
   ( NULL , REPEAT ( 'x' , 50 ) , REPEAT ( 'y' , 50 ) , UNIX_TIMESTAMP ( '2016-01-01 00:00:00' ) ) ,
   ( NULL , REPEAT ( 'x' , 50 ) , REPEAT ( 'y' , 50 ) , UNIX_TIMESTAMP ( '2016-02-01 00:00:00' ) ) ,
   ( NULL , REPEAT ( 'x' , 50 ) , REPEAT ( 'y' , 50 ) , UNIX_TIMESTAMP ( '2016-03-01 00:00:00' ) ) ;
 
DROP PROCEDURE insert_partition_table ;
DELIMITER //
CREATE PROCEDURE insert_partition_table ( )
BEGIN
   DECLARE i INT ;
   SET i = 0 ;
   WHILE i < 22 DO
       INSERT INTO partition_table
       SELECT NULL , name , context , create_time FROM partition_table ;
       SET i = i + 1 ;
   END WHILE ;
END //
DELIMITER ;
 
CALL insert_partition_table ( ) ;

查看使用磁盘的容量情况



ll - h
- rw - r -- -- - 1 mysql mysql 8.5K Apr    2 17 : 06 partition_table . frm
- rw - r -- -- - 1 mysql mysql 700M Apr    2 17 : 12 partition_table #P#p1.ibd
- rw - r -- -- - 1 mysql mysql 700M Apr    2 17 : 12 partition_table #P#p2.ibd
- rw - r -- -- - 1 mysql mysql 700M Apr    2 17 : 13 partition_table #P#p3.ibd

上面我们可以看到分区表的结构是每一个分区有着自己的表空间。


现在我们删除1月份的数据,这里我们只需要删除p1分区就好。



--在删除分区前应该先创建下一个月的分区
ALTER TABLE partition_table ADD partition (
   partition p4 VALUES LESS THAN ( UNIX_TIMESTAMP ( '2016-04-30 23:59:59' ) )
) ;
 
--删除一月份的分区
ALTER TABLE partition_table DROP partition p1 ;
ll - h
- rw - r -- -- - 1 mysql mysql 8.5K Apr    2 17 : 20 partition_table . frm
- rw - r -- -- - 1 mysql mysql 700M Apr    2 17 : 12 partition_table #P#p2.ibd
- rw - r -- -- - 1 mysql mysql 700M Apr    2 17 : 13 partition_table #P#p3.ibd
- rw - r -- -- - 1 mysql mysql 112K Apr    2 17 : 26 partition_table #P#p4.ibd

可以看到只要我们删除表空间就能直接的释放磁盘空间。


1.5. 总结

上面的演示可以看到在保存日志之类的数据使用partition是在合适不过的了,不仅能节省空间还很方便我们的维护。


标签:00,normal,partion,partition,--,分区表,mysql,table
From: https://blog.51cto.com/u_6186189/6922871

相关文章

  • mysql千万条据下的分页
    1.1.背景对于开发来说,分页功能碰到的频率还是算蛮高的,基本上在每个模块中都需要都会遇到列表分页的功能。他们实现的都很快,因为基本上只要把之前的代码改改就OK了。他们的实现基本是是如下语句:SELECT*FROMgoodsWHEREuser_id=4LIMIT1000,20;...omit...20rows......
  • SQL总结-MySQL索引使用和优化技巧
    本文将全面介绍MySQL索引的使用技巧,并提供多种优化索引的方法,帮助读者提高数据库查询性能。MySQL索引基础知识索引的工作原理索引就像书的目录,可以帮助MySQL快速定位数据,从而加速查询。索引类型MySQL支持多种索引类型:B树索引(B-Tree):最常见的索引类型,可以对值进行排......
  • 12.1 - 19c Oracle分区表的新特性
    12.1ReleaseAsynchronousGlobalIndexMaintenanceforDROPandTRUNCATEPartitiondrop及truncate分区时支持异步全局索引维护之前drop或truncate分区时,会使全局索引不可用,updateindexes和updateglobalindexes虽然可以维护索引的可用性,但是索引的维护是立刻发生的,业务高峰时......
  • 理解MySQL——索引与优化
    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页......
  • 智慧校园源码:vue2+Java+springboot+MySQL+elmentui+jpa+jwt
    智慧校园综合管理云平台源码系统主要以校园安全、智慧校园综合管理云平台为核心,以智慧班牌为学生智慧之窗,以移动管理平台、家校沟通为辅。教师—家长一学校—学生循环的无纸化管理模式及教学服务,实现多领域的信息互联互通以及校园管理一体化、信息数据化、数据自动化。智慧班牌融合......
  • 导入mysql 乱码问题及 Linux 中的文件格式转换
    问题下载了一个单词sql文件,导入mysql报错,查看文件类型:%fileenglish_word.sqlenglish_word.sql:Non-ISOextended-ASCIItext与另一个导入成功的文件对比,发现格式不一样:%fileenglish-root.sqlenglish-root.sql:UTF-8Unicodetext,withverylonglines,withnoli......
  • MySQL8压缩包安装教程
    解压缩包配置环境变量初始化mysqld--initialize-insecure安装服务mysqldinstallMySQL8移除服务mysqldremoveMySQL8启动服务netstartMySQL8修改密码切换数据库usemysql;修改root用户的密码alteruser'root'@localhostidentifiedby'mysql';刷新权限,一般......
  • liunx 环境 mysql5.6安装
    1安装包下载mysql5.6下载地址:http://dev.mysql.com/downloads/mysql/ 这里选择Linux版本:使用Navicat管理远程Linux服务器上的MySQL数据库 http://www.linuxidc.com/Linux/2011-09/42285.htm ftp://mirror.switch.ch/mirror/mysql/Downloads/MySQL-5.6/2mysql的安装从官网下载......
  • MySQL中动态SQL的解决方法:预处理语句
    动态SQL是一种很好的特性,允许开发人员在运行时动态构建和执行SQL语句。虽然MySQL缺乏对动态SQL的内置支持,但本文介绍了使用预处理语句(preparedstatements)的变通方法。将探讨如何利用预处理语句实现动态查询执行、参数化查询以及动态表和列查询。 了解预处理语句(preparedst......
  • docker 不适合MySQL
    近几年Docker非常的火热,各位开发者恨不得把所有的应用、软件都部署在Docker容器中,但是您确定也要把数据库也部署的容器中吗?这个问题不是子虚乌有,因为在网上能够找到很多各种操作手册和视频教程,这里整理了一些数据库不适合容器化的原因供大家参考,同时也希望大家在使用时能够谨慎一......