MySQL数据表range分区例子
某些行业数据量的增长速度极快,随着数据库中数据量的急速膨胀,数据库的插入和查询效率越来越低。此时,除了程序代码和查询语句外,还得在数据库的结构上做点更改;在一个主读辅写的数据库中,当数据表数据超过1000w行后,那查询效率真的很让人抓狂。就算早前建了索引,也很难满足用户对于系统查询效率的体验。
优化方案是分表或分区。至于分区的原理以及分区和分表的区别,搜索一下,都介绍的很详细,这里就不作冗余介绍。简单来讲,分表旨在提高数据库的并发能力,分区旨在优化磁盘的IO和数据的读写,所以采用什么方案,还得根据业务再作斟酌。由于我们的系统对并发要求不高,所以便采用了分区。
分区是MySQL5.1以后实现的。其中分区类型有RANGE分区、LIST分区、HASH分区、KEY分区。我们这里是使用RANGE分区来讲解。
分区需要注意的一点是:要么不定义主键,要么把分区字段添加到主键中。并且分区字段不能为NULL,要不然就难以确定分区范围。所以要设为NOT NULL。
首先执行一下show plugins; 查看partition这一栏是否为ACTIVE,是则表示数据库支持分区。
1、创建一个数据表并分区:
CREATE TABLE ` table_name` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`uid` VARCHAR(50) DEFAULT NULL,
`action` VARCHAR(10) DEFAULT NULL,
` channel` VARCHAR(20) DEFAULT NULL,
`count_left` INT(11) DEFAULT NULL,
`end_time` INT(11) DEFAULT '0',
PRIMARY KEY (`id`,`end_time`),
KEY `time` (`end_time`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8
PARTITION BY RANGE(`end_time`) (
PARTITION p161130 VALUES LESS THAN (1480550399),
PARTITION p161231 VALUES LESS THAN (1483228799),
PARTITION p170131 VALUES LESS THAN (1485907199),
PARTITION p170228 VALUES LESS THAN (1488326399),
PARTITION p170331 VALUES LESS THAN (1491004799),
PARTITION p170430 VALUES LESS THAN (1493596799),
PARTITION p170531 VALUES LESS THAN (1496275199),
PARTITION p170631 VALUES LESS THAN (1498867199),
PARTITION pnow VALUES LESS THAN MAXVALUE
);
2、修改一个数据表分区:
ALTER TABLE `table_name`
PARTITION BY RANGE(`end_time`) (
PARTITION p161130 VALUES LESS THAN (1480550399),
PARTITION p161231 VALUES LESS THAN (1483228799),
PARTITION p170131 VALUES LESS THAN (1485907199),
PARTITION p170228 VALUES LESS THAN (1488326399),
PARTITION p170331 VALUES LESS THAN (1491004799),
PARTITION p170430 VALUES LESS THAN (1493596799),
PARTITION p170531 VALUES LESS THAN (1496275199),
PARTITION p170631 VALUES LESS THAN (1498867199),
PARTITION pnow VALUES LESS THAN MAXVALUE
);
说明:1、2中使用end_time (时间是以时间戳的形式记录的) 作为分区字段对表进行分区。分区的区分值为分区名中的时间的时间戳形式,比如2016/11/30 23:59:59 转为秒数为1480550399。以上的代码中,我将数据表分为9个区,从16年11月30日到17年06月31日 共8个区加上pnow这个区存放17年6月31日以后的数据;如上所示,16年11月30日以前的数据,将会存放在p161130这个分区中16年12月01日至16年12月31日的数据将会存放在p161231分区中,以此类推…
分区后可以执行以下语句查看效果(后面也可以用该语句查看每个分区中有多少数据):
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'table_name';
3、删除一个分区:
执行语句:ALTER TABLE table_name DROP PARTITION p_name;
注意:删除一个分区时,该分区内的所有数据也都会被删除;
如果用这样来删除数据,要比用delete from table_name where …要有效得多;
4、新增一个分区:
执行语句:ALTER TABLE table_name ADD PARTITION (PARTITION p_name VALUES LESS THAN (xxxxxxxxx));
注意:如果原先最后一个分区是PARTITION pnow VALUES LESS THAN MAXVALUE; 那么应该先删除该分区,然后在执行新增分区语句,然后再新增回该分区;
MySQL数据表range分区例子的更多相关文章
- Mysql分表和分区的区别、分库分表介绍与区别
分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...
- MYSQL分表与分区
什么是分表分区分表分区的区别实现方式上数据处理上提高性能上实现的难易度上mysql分表和分区的联系如何分区概述分区技术支持分区类型及举例注意应用场景示例订单表比预想中扩张速度快坑爹的日志表每半月一个分 ...
- mysql分表,分区的区别和联系
一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...
- Mysql分表和分区的区别
一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...
- Mysql分表和分区的区别、分库分表介绍与区别(转)
分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...
- mysql分表和分区实际应用简介
一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...
- Mysql分表和分区的区别、分库和分表区别
一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法. 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个 ...
- mysql数据表增删改查
http://www.runoob.com/mysql/mysql-tutorial.html 一.MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以 ...
- MySql数据表设计,索引优化,SQL优化,其他数据库
MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...
随机推荐
- 11. KVC And KVO
1. KVC And KVO 的认识 KVC/KVO是观察者模式的一种实现 KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用 ...
- Echarts 3.19 制作常用的图形 非静态
最近阿里内部使用的 图表也向外开放了 而百度就好像更有良心一点,Echarts 早就开放了 . 自己学Echarts的时候走了很多的弯路,毕竟谁让自己菜呢,多撞几次南墙才晓得疼 才知道学习方法,新手上 ...
- [Project Name] was compiled with optimization - stepping may behave oddly; variables may not be available.
控制台输出的时候显示一串这样的信息:[Project Name] was compiled with optimization - stepping may behave oddly; variabl ...
- U盘安装centos7 无法进入安装界面,进入dracut命令的解决办法。
最近想要装一个centos7 玩一玩,就从网上下了个镜像,用UltraISO制作了安装U盘,准备在旧电脑上装一个. 结果始终无法进入安装界面,而是进入了dracut命令行. 从网上找了解决方法:
- list for循环中删除元素
Iterator.remove() is safe, you can use it like this: List<String> list = new ArrayList<> ...
- 【leetcode】Palindrome Number
题目简述: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could n ...
- CozyRSS开发记录10-RSS源管理
CozyRSS开发记录10-RSS源管理 1.RSS源树结构 做解析体力活很多,把RSS解析的优化先放放,先玩一玩RSS源的管理. 虽然在初步的设计中,RSS源是以一个列表的方式来展示,但是,我觉得如 ...
- 【Java 新建项目】使用程序对新项目的各个实体 创建Dao、DaoImpl、Service、ServiceImpl层的文件
首先给出基本Dao层代码: GenericDao.java package com.agen.dao; import java.io.Serializable; import java.util.Co ...
- ViewPager+Fragment取消预加载(延迟加载)(转)
原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...
- Java随机生成18位身份证号
package com.ihome.data; import java.text.SimpleDateFormat; import java.util.Calendar; import java.ut ...