Mysql表分区实现

(一)、分区的限制:

1.主键或者唯一索引必须包含分区字段,如primary key (id,username),不过innoDB的大组建性能不好。

2.很多时候,使用分区就不要在使用主键了,否则可能影响性能。

3.只能通过int类型的字段或者返回int类型的表达式来分区,通常使用year或者to_days等函数(mysql 5.6 对限制开始放开了)。

4.每个表最多1024个分区,而且多分区会大量消耗内存。

5.分区的表不支持外键,相关的逻辑约束需要使用程序来实现。

6.分区后,可能会造成索引失效,需要验证分区可行性。

(二)、分区实现:

第一步:添加日期作为主键部分
alter table erp_bill_index drop primary key;-- 删除主键 201s
alter table erp_bill_index add primary key(billid,billdate);-- 添加主键203s

第二步:创建分区

ALTER TABLE erp_bill_index PARTITION by RANGE(to_days(billdate))
(PARTITION p201801 VALUES LESS THAN (to_days('2018-02-01')),PARTITION p201802 VALUES LESS THAN (to_days('2018-03-01')),PARTITION p201803 VALUES LESS THAN (to_days('2018-04-01')),PARTITION p201804 VALUES LESS THAN (to_days('2018-05-01')),PARTITION p201805 VALUES LESS THAN (to_days('2018-06-01')),PARTITION p201806 VALUES LESS THAN (to_days('2018-07-01')),PARTITION p201807 VALUES LESS THAN (to_days('2018-08-01')),PARTITION p201808 VALUES LESS THAN (to_days('2018-09-01')),PARTITION p201809 VALUES LESS THAN (to_days('2018-10-01')),PARTITION p201810 VALUES LESS THAN (to_days('2018-11-01')),PARTITION p201811 VALUES LESS THAN (to_days('2018-12-01')),PARTITION p201812 VALUES LESS THAN (to_days('2019-01-01')),PARTITION p201901 VALUES LESS THAN (to_days('2019-02-01')),PARTITION p201902 VALUES LESS THAN (to_days('2019-03-01')),PARTITION p201903 VALUES LESS THAN (to_days('2019-04-01')),PARTITION p201904 VALUES LESS MAXVALUE
);

第三步:添加分区
alter table erp_bill_index add PARTITION
(
PARTITION p201905 VALUES LESS THAN (to_days(‘2019-06-01’)) ENGINE = InnoDB
)

第四部步:自动添加分区
DELIMITER KaTeX parse error: Expected 'EOF', got '#' at position 2: #̲该表所在数据库名称 USE `…
DROP PROCEDURE IF EXISTS create_partition_by_monthKaTeX parse error: Expected 'EOF', got '#' at position 110: …64)) BEGIN #̲当前日期存在的分区的个数 …
DELIMITER ;

第五步:定时任务
DELIMITER KaTeX parse error: Expected 'EOF', got '#' at position 2: #̲该表所在的数据库名称 USE …
CREATE EVENT IF NOT EXISTS month_generate_partition
ON SCHEDULE EVERY 1 MONTH #执行周期,还有天、月等等
STARTS ‘2019-04-01 00:00:00’
ON COMPLETION PRESERVE
ENABLE
COMMENT ‘Creating partitions’
DO BEGIN
#调用刚才创建的存储过程,第一个参数是数据库名称,第二个参数是表名称
CALL testtable.create_partition_by_month(‘testtable’,‘erp_bill_index’);
END$$
DELIMITER ;

(三)、处理定时任务不执行问题:
SHOW VARIABLES LIKE ‘event_scheduler’
SET GLOBAL event_scheduler = 1;

开启事件:
ALTER EVENT event_name ON COMPLETION PRESERVE ENABLE; /event_name 事件名称/

处理问题:
地址:https://zhidao.baidu.com/question/1543863766414881427.html

相应文件
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini skip-grant-tables

(四)、问题整理
1)、错误:Table has no partition for value 738059(没有包含所有数据)
先查询最大值
SELECT billdate from erp_bill_index where billdate>‘2019-05-01’ ORDER BY billdate DESC LIMIT 0,20;
在添加最大分区;

2)、创建分区之后,查询时解析可以看到使用分区情况:
EXPLAIN
SELECT billdate from erp_bill_index_test where billdate>‘2019-05-01’ ORDER BY billdate DESC LIMIT 0,20;

以上步骤执行完成,表分区就实现了,如果出现问题大家可以相互探讨交流,相互学习~

Mysql表分区实现相关推荐

  1. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...

  2. Mysql表分区的选择与实践小结

    2019独角兽企业重金招聘Python工程师标准>>> 在一些系统中有时某张表会出现百万或者千万的数据量,尽管其中使用了索引,查询速度也不一定会很快.这时候可能就需要通过分库,分表, ...

  3. maxvalue mysql自动分区_创建mysql表分区的方法

    创建 mysql 表分区的方法 我来给大家介绍一下 mysql 表分区创建与使用吧,希望对各位同学会有所帮助.表分区的测试使用,主要内容来自 于其他博客文章以及 mysql5.1 的参考手册. 表分区 ...

  4. mysql分区表优缺点,Mysql 表分区和性能

    以下内容节选自 mysql表分区: 分区功能并不是所有存储引擎都支持的,如CSV.MERGE等就不支持.mysql数据库支持的分区类型为水平分区(指一张表中不同行的记录分配到不同的物理文件中),不支持 ...

  5. 处理Zabbix历史数据库办法二---使用MySQL表分区

    一 应用场景描述 http://john88wang.blog.51cto.com/2165294/1770582 在前面介绍可以通过创建新表然后导入一个月内的数据到新表,最后删除旧表的方法来处理历史 ...

  6. mysql 表分区、按时间函数分区、删除分区、自动添加表分区

    mysql 表分区的几种方式: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进 ...

  7. MySql表分区介绍

    一.什么是表分区 表分区就是就是把表的数据切分成不同的块进行存储,可以存储在不同的文件系统.而用户所选择的.实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个连续的数 ...

  8. mysql 支持分区表,mysql表分区的限制

    头一次使用mysql表分区,遇到不少的问题,现在总结下遇到的问题和解决方案. 1.如果分区值类型不是整型值,会出现如下错误: [Err] 1697 - VALUES value for partiti ...

  9. MySQL表分区细节逻辑

    MySQL表分区细节逻辑 一.建表时进行分区 二.建表后进行分区(消耗资源巨大) 一.建表时进行分区 Range分区表建表语句如下,其中分区键必须和id构成主键和唯一键: create table i ...

  10. mysql 添加分区_创建,增加,删除mysql表分区

    1.测试添加分区和删除分区 ###添加删除range分区 (1)创建一个分区: CREATE TABLE titles ( emp_no      INT NOT NULL, title        ...

最新文章

  1. Linux umount 报 device is busy 的处理方法
  2. JAVA-封装-静态属性
  3. 《挑战30天C++入门极限》C/C++中字符串常量的不相等性及字符串的Copy
  4. npm 查看当前生效的配置
  5. android data binding jetpack III 绑定一个方法
  6. 《剑指offer》和为s的连续正数序列
  7. Android 隐藏状态栏,沉浸式状态栏,状态栏背景色,状态栏字体色,透明状态工具类
  8. 如何实现 MySQL 删除重复记录并且只保留一条
  9. 2 image pil 转_「博文连载」RGB888转YCbCr的HDL实现
  10. 【Linux 驱动】第十章 中断处理
  11. 以Flappy Bird破解为例介绍andriod apk加壳方法
  12. dedecms 会员发布的信息后台未审核,前台显示审核修改
  13. 日常一记(11)--word公式输入任意矩阵
  14. 使用Resource Hacker+W32Dasm+OD移除警告窗口
  15. 安装yasm(汇编编译器)和 nasm
  16. Python拉宾米勒(判断素数)
  17. 第十一章 Caché 命令大全 HALT 命令
  18. java报错establishing_[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket错误解决方法总结...
  19. max pooling 和 average pooling
  20. 利用k8s集群部署第一个容器化应用

热门文章

  1. 表单提交中get和post方式的区别
  2. 2020-2021学年第二学期期末考试《国际结算》大作业
  3. CSS中@support的用法
  4. [Plant Simulation]工人开车搬运及装卸货物(Transporter的复合使用及pe函数)
  5. 网络开发套接字以及UDP、TCP协议
  6. SpringBoot项目实现增删改查
  7. 大数据mysql 更换密码_解决重置Mysql root用户账号密码问题
  8. 蓝桥杯:火柴游戏(经典的博弈算法)
  9. 魔兽世界怀旧服务器无限刷怪点,魔兽世界怀旧服无限刷怪点 魔兽世界怀旧服无限刷怪点介绍...
  10. div 超出部分隐藏有滚动条