当前位置: 首页 > news >正文

mysql表分区案例

0、整理表空间碎片
optimize table tablename

1、表分区按年分区,季度子分区

alter table key_part 
partition by range(year(create_time))
subpartition by hash(quarter(create_time))
subpartitions 4 (
    partition p0 values less than (2015),
    partition p2015 values less than (2016),
    partition p2016 values less than (2017),
    partition p2017 values less than (2018),
    partition p2018 values less than (2019),
    partition p1 values less than maxvalue
);

 

总共产生24个分区,1年4个季度,6年24个季度。

2、按照天分区月表
create_time支持如下日期格式:
%Y-%c-%d
%Y-%c-%d %h:%i:%s

alter table aa 
partition by range (to_days(create_time)) (
    partition p01 values less than (to_days('2018-04-01')) engine = innodb,
    partition p02 values less than (to_days('2018-04-02')) engine = innodb,
    partition p03 values less than (to_days('2018-04-03')) engine = innodb,
    partition p04 values less than (to_days('2018-04-04')) engine = innodb,
    partition p05 values less than (to_days('2018-04-05')) engine = innodb,
    partition p06 values less than (to_days('2018-04-06')) engine = innodb,
    partition p07 values less than (to_days('2018-04-07')) engine = innodb,
    partition p08 values less than (to_days('2018-04-08')) engine = innodb,
    partition p09 values less than (to_days('2018-04-09')) engine = innodb,
    partition p10 values less than MAXVALUE engine = innodb     
);

 

explain partitions select * from key_part where create_time>='2018-04-12' and create_time<='2018-04-15'

可以看到只遍历了4个分区表,只扫描了4行,而不是扫描所有的行。

explain partitions select * from key_part where create_time>='2018-04-27'

可以看到只遍历了5个分区表,只扫描了5行,而不是扫描所有的行。

 3、按照年分区表

alter table user partition by linear hash(year(create_time)) partitions 12;

在5.7版本之前,对于data和datetime类型的列,如果要实现分区裁剪,只能使用year() 和to_days()函数,在5.7版本中,又新增了to_seconds()函数。

4、MYSQL的分区字段,必须包含在主键字段内或唯一索引内

这是因为表分区时,分区字段必须包含在主键字段内或唯一索引内,一张表只能有一个主键或一个唯一索引,主键和唯一索引不能同时存在

CREATE TABLE `key_part` (
  `news_id` int(11) NOT NULL COMMENT '新闻id',
  `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '新闻内容',
  `u_id` varchar(25) NOT NULL DEFAULT '' COMMENT '来源ip',
  `create_time` datetime NOT NULL COMMENT '时间',
  PRIMARY KEY (`u_id`,`create_time`),
  KEY `create_time` (`create_time`) USING BTREE,
  KEY `aa` (`news_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50500 PARTITION BY RANGE  COLUMNS(create_time)
(PARTITION p01 VALUES LESS THAN ('2018-01-01') ENGINE = InnoDB,
 PARTITION p02 VALUES LESS THAN ('2018-03-01') ENGINE = InnoDB,
 PARTITION p03 VALUES LESS THAN ('2018-05-01') ENGINE = InnoDB,
 PARTITION p04 VALUES LESS THAN ('2018-07-01') ENGINE = InnoDB,
 PARTITION p05 VALUES LESS THAN ('2018-09-01') ENGINE = InnoDB,
 PARTITION p06 VALUES LESS THAN ('2018-11-01') ENGINE = InnoDB,
 PARTITION p07 VALUES LESS THAN ('2019-01-01') ENGINE = InnoDB,
 PARTITION p08 VALUES LESS THAN ('2020-01-01') ENGINE = InnoDB,
 PARTITION p09 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB) */;

 

5、Columns分区

alter table key_part 
partition by range columns(create_time) (
    partition p01 values less than ('2018-01-01') engine = innodb,
    partition p02 values less than ('2018-03-01') engine = innodb,
    partition p03 values less than ('2018-05-01') engine = innodb,
    partition p04 values less than ('2018-07-01') engine = innodb,
    partition p05 values less than ('2018-09-01') engine = innodb,
    partition p06 values less than ('2018-11-01') engine = innodb,
    partition p07 values less than ('2019-01-01') engine = innodb,
    partition p08 values less than ('2020-01-01') engine = innodb,
    partition p09 values less than maxvalue engine = innodb
);

 

6、添加表分区

-- 对表重新表分区
alter table lot_order_aa partition by range columns(create_time)(partition p03 values less than ('2018-03-01'));

-- 在已有分区的表上,添加表分区
alter table lot_order_aa add partition (partition p05 values less than ('2018-05-01'));

 

相关文章:

  • C# :WinForm TextBox猜想输入和历史记录输入
  • 并发服务器:Redis案例研究分析
  • POJ 3041 Asteroids (最小点覆盖集)
  • 不通过调用__Init__来创建实例
  • 算法学习--动手
  • 10-padding(内边距)
  • linux中grep和egrep的用法
  • hashlib模块学习:hmac
  • 开发基于以太坊智能合约的DApp
  • vue-cli脚手架一些插件安装elementui和axios
  • MD5加密解密
  • MS SQL 需要定期清理日志文件
  • Django-admin管理工具
  • Spring读书笔记-----部署我的第一个Spring项目
  • 减少死锁的几个常用方法
  • django开发-定时任务的使用
  • ECMAScript6(0):ES6简明参考手册
  • es6要点
  • JavaScript服务器推送技术之 WebSocket
  • js作用域和this的理解
  • Material Design
  • Vue学习第二天
  • webpack+react项目初体验——记录我的webpack环境配置
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 对象引论
  • 反思总结然后整装待发
  • 关于for循环的简单归纳
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 简析gRPC client 连接管理
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 使用agvtool更改app version/build
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • PostgreSQL之连接数修改
  • ​2021半年盘点,不想你错过的重磅新书
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (七)c52学习之旅-中断
  • (七)Knockout 创建自定义绑定
  • (转)EXC_BREAKPOINT僵尸错误
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Remoting学习笔记(三)信道
  • .NET 表达式计算:Expression Evaluator
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .py文件应该怎样打开?