前些天拿到一个表,将近有4000w数据,没有任何索引,主键。(建这表的绝对是个人才)

这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计。。。。。(这要用超级计算机才能统计得出来吧),只能帮前人填坑了。。。。

数据太大,决定用分区来重构。

如果你发现是empty,说明你的mysql版本不够,分区至少要5.1

下面针对业务查询,决定用时间来做range分区(还有list,hash等类型),一个月一个区.

按照RANGE分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。

新建一个表:

CREATE TABLE `xxxxxxxx` (

`crttm` int(11) NOT NULL,

`srvid` int(11) NOT NULL,

`evtid` int(11) NOT NULL,

`aid` int(11) NOT NULL,

`rid` int(11) NOT NULL,

`itmid` int(11) NOT NULL,

`itmnum` int(11) NOT NULL,

`gdtype` int(11) NOT NULL,

`gdnum` int(11) NOT NULL,

`islmt` int(11) NOT NULL,

KEY `crttm` (`crttm`),

KEY `itemid` (`itmid`),

KEY `srvid` (`srvid`),

KEY `gdtype` (`gdtype`)

) ENGINE=myisam DEFAULT CHARSET=utf8

PARTITION BY RANGE (crttm)

(

PARTITION p201303 VALUES LESS THAN (unix_timestamp('2013-04-01')),

PARTITION p201304 VALUES LESS THAN (unix_timestamp('2013-05-01')),

PARTITION p201305 VALUES LESS THAN (unix_timestamp('2013-06-01')),

PARTITION p201306 VALUES LESS THAN (unix_timestamp('2013-07-01')),

PARTITION p201307 VALUES LESS THAN (unix_timestamp('2013-08-01')),

PARTITION p201308 VALUES LESS THAN (unix_timestamp('2013-09-01')),

PARTITION p201309 VALUES LESS THAN (unix_timestamp('2013-10-01')),

PARTITION p201310 VALUES LESS THAN (unix_timestamp('2013-11-01')),

PARTITION p201311 VALUES LESS THAN (unix_timestamp('2013-12-01')),

PARTITION p201312 VALUES LESS THAN (unix_timestamp('2014-01-01')),

PARTITION p201401 VALUES LESS THAN (unix_timestamp('2014-02-01'))

);

注意:

1. primary key和unique key必须包含在分区key的一部分,否则在创建primary key和unique index时会报”ERROR 1503 (HY000)“

mysql> create unique index idx_employees1_job_code on employees1(job_code);

ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function

mysql> ALTER TABLE `skate`.`employees1` ADD PRIMARY KEY (`id`) ;

ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

2. 范围分区添加分区只能在最大值后面追加分区

3. 所有分区的engine必须一样

4. 范围分区分区字段:integer、数值表达式、日期列,日期函数表达式(如year(),to_days(),to_seconds(),unix_timestamp())

将旧的表数据导入到新表后,看到新表的数据都分布到不同的区了!

维护命令:

添加分区

alter table xxxxxxx add partition (partition p0 values less than(1991)); //只能添加大于分区键的分区

删除分区

alter table xxxxxxx drop partition p0; //可以删除任意分区

删除分区数据

alter table xxxxxx truncate partition p1,p2;

alter table xxxxxx truncate partition all;

delete from xxxxxx where separated < '2006-01-01' or (separated >= '2006-01-01' and separated

重定义分区(包括重命名分区,伴随移动数据;合并分区)

alter table xxxxx reorganize partition p1,p3,p4 into (partition pm1 values less than(2006),

partition pm2 values less than(2011));

rebuild重建分区

alter table xxxxxx rebuild partition pm1/all; //相当于drop所有记录,然后再reinsert;可以解决磁盘碎片

优化表

alter table tt2 optimize partition pm1; //在大量delete表数据后,可以回收空间和碎片整理。但在5.5.30后支持。在5.5.30之前可以通过recreate+analyze来替代,如果用rebuild+analyze速度慢

analzye表

alter table xxxxxx analyze partition pm1/all;

check表

alter table xxxxxx check partition pm1/all;

show create table employees2; //查看分区表的定义

show table status like 'employees2'\G; //查看表时候是分区表 如“Create_options: partitioned”

select * from information_schema.KEY_COLUMN_USAGE where table_name='employees2'; //查看索引

SELECT * FROM information_schema.partitions WHERE table_name='employees2' //查看分区表

explain partitions select * from employees2 where separated < '1990-01-01' or separated > '2016-01-01'; //查看分区是否被select使用

mysql分区 seect_实战mysql分区(PARTITION)相关推荐

  1. mysql truncate partition_实战mysql分区(PARTITION)

    前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计.....(这要用超级计算机才能统计得 ...

  2. mysql 热备,实战mysql双机实时热备份

    以前数据库备份采用的方式一般都是每天定时使用 mysqldump 到处 sql 文件,然后传到异地备份.不过这种定时备份有个问题就是如果服务器出问题了,那么这个备份和实际的业务数据总有一段时间的差异, ...

  3. add partition mysql_实战mysql分区(PARTITION)

    前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计.....(这要用超级计算机才能统计得 ...

  4. mysql表分区join_​实战:Flink 1.12 维表 Join Hive 最新分区功能体验

    ​实战:Flink 1.12 维表 Join Hive 最新分区功能体验 余东@哗啦啦 Flink 中文社区 我们生产常有将实时数据流与 Hive 维表 join 来丰富数据的需求,其中 Hive 表 ...

  5. mysql按照省市给表分区_表分区-partition

    partition分区: 设置分区限制,t0:1-10,t1:10-20,t2:20-最大值: 插入数据后可以看到topic表出现了t0.t1.t2: 按照散点值分区: 创建地区表: 建立会员表,根据 ...

  6. MySQL的分表和分区介绍

    在日常开发或维护中经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和 ...

  7. MySQL基于时间字段进行分区的方案总结

    MySQL支持的分区类型一共有四种:RANGE,LIST,HASH,KEY.其中,RANGE又可分为原生RANGE和RANGE COLUMNS,LIST分为原生LIST和LIST COLUMNS,HA ...

  8. mysql的hash分区_MySQL中的分区(五)HASH分区

    HASH分区主要用来分散热点读,取保数据在预先确定个数的分区中尽可能的平均分布.对一个表执行HASH分区时,MySQL会对分区键应用一个散列函数,一次确定数据应该放在哪一个分区中. MySQL分区支持 ...

  9. mysql 社区版 innodb_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) / --------------------         写在最前面            ------------------ ...

  10. mysql 字符列做日期分区_mysql 根据日期字段做表分区

    mysql 的表分区有几种类型, list, hash, range等, 今天我们介绍下日期分区, 假如与如下表: 新建mysql分区表CREATE TABLE core(   core_id INT ...

最新文章

  1. [PHP] debug_backtrace()可以获取到代码的调用路径追踪
  2. starUML--面向对象的设计过程
  3. 试题 E: 迷宫 第十届蓝桥杯
  4. 如何抓住重点,系统高效地学习数据结构与算法?
  5. 你竟然没用 Nuget 构建项目?
  6. 学生档案c语言编程,学生档案管理问题
  7. 宫崎骏最美最经典的语录是什么?
  8. PrimaDonna智能咖啡机,咖啡也要私人定制
  9. 系列4—BabeLua常见问题
  10. 2021最新H3CSE认证备考练习题,错过等明年!
  11. WiFi语音智能家居控制系统(一)
  12. 使用fate框架训练流程
  13. 从B站的代码泄露事件中,我们能学到些什么?
  14. Vue项目使用拦截器和JWT验证 完整案例
  15. VIM设置,自动换行
  16. 物联网开发和管理平台 - shifu 了解与学习
  17. 世系是家谱的核心,编修家谱过程中我们应该如何编写世系图
  18. 《字字带泪——写在三十岁到来这一天》 By 王潇
  19. Java项目:大学生健康档案管理系统(java+jpa+swagger-ui+springboot+vue+mysql)
  20. ACM 入门1169

热门文章

  1. java ssh详解_JAVA SSH 框架介绍
  2. PowerDesigner16.5下载和安装教程
  3. 构建简单的智能客服系统(三)——基于 UniMRCP 实现讯飞 TTS MRCP Server
  4. 南京大学俞扬博士AIDL演讲全文:强化学习前沿(上)
  5. 第十一章 软件能力成熟度模型
  6. windwos11降级,重装Windows10
  7. java1.4.2中文下载_j2sdk1.4.2|Java 2 SDK Standard Edition(Java开发平台)下载v1.4.2官方版 - 欧普软件下载...
  8. webservice解析xml文件
  9. linux定时器原理
  10. Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(8):wifi与蓝牙