某些行业数据量的增长速度极快,随着数据库中数据量的急速膨胀,数据库的插入和查询效率越来越低。此时,除了程序代码和查询语句外,还得在数据库的结构上做点更改;在一个主读辅写的数据库中,当数据表数据超过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分区例子的更多相关文章

  1. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  2. MYSQL分表与分区

    什么是分表分区分表分区的区别实现方式上数据处理上提高性能上实现的难易度上mysql分表和分区的联系如何分区概述分区技术支持分区类型及举例注意应用场景示例订单表比预想中扩张速度快坑爹的日志表每半月一个分 ...

  3. mysql分表,分区的区别和联系

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  4. Mysql分表和分区的区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  5. Mysql分表和分区的区别、分库分表介绍与区别(转)

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  6. mysql分表和分区实际应用简介

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  7. Mysql分表和分区的区别、分库和分表区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法. 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个 ...

  8. mysql数据表增删改查

    http://www.runoob.com/mysql/mysql-tutorial.html 一.MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以 ...

  9. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

随机推荐

  1. 文件服务器:FTP服务器详解

    文件服务器:FTP服务器 数据传输原理 功能简介 文件的传输与管理 不同等级的用户身份:user.guest.anonymous 实体用户.权限较完整 匿名用户.下载资源的能力 命令记录与日志文件记录 ...

  2. Enterprise Achitect使用与类的关系的简单介绍

    本文作为Enterprise Achitect初步使用,另外也是类图基本介绍,是设计模式的基础.  类的关系有泛化(Generalization).实现(Realization).依赖(Depende ...

  3. UnrealScript语言基础

    总体特征 (1)大小写不敏感.关键字.宏.变量名.函数名以及类名不区分大小写:变量名可以与关键字同名 (2)局部变量.成员变量未初始化时,会被编译器初始化 (3)没有全局变量.全局函数,所有东西必须写 ...

  4. 配置比对脚本(python)

    # -*- coding: utf- -*- from datetime import * import MySQLdb import sys import time import datetime ...

  5. [UWP]UWP中获取联系人/邮件发送/SMS消息发送操作

    这篇博客将介绍如何在UWP程序中获取联系人/邮件发送/SMS发送的基础操作. 1. 获取联系人 UWP中联系人获取需要引入Windows.ApplicationModel.Contacts名称空间. ...

  6. 相机标定简介与MatLab相机标定工具箱的使用(未涉及原理公式推导)

    相机标定 一.相机标定的目的 确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数. 二.通用摄像机模型 世界坐标系.摄像机坐标 ...

  7. jquery lazyload延迟加载技术的实现原理分析

    懒加载技术(简称lazyload)并不是新技术,它是js程序员对网页性能优化的一种方案.lazyload的核心是按需加载.在大型网站中都有lazyload的身影,例如谷歌的图片搜索页,迅雷首页,淘宝网 ...

  8. java后台获取Access_token的工具方法

    本方法主要通过java后台控制来获取Access_token,需要你已经知道自己的ID跟密码 因为微信的权限设置大概每天可以获取两千条,每条有效时间为2小时 /** * 输入自己的id跟密码,获取微信 ...

  9. 一些Matlab函数的使用

    1.Kron(A,B) 矩阵A中的每个元素都乘以矩阵B.${A_{m \times n}}$,${B_{m \times n}}$,${\bf{A}} \otimes {\bf{B}} = {({a_ ...

  10. SQL Server 递归

    SQL Server 没有类似于Oracle START WITH NAME='xx' CONNECT BY PRIOR ID=PARENT_ID这样的语句,但是可以通过自定义标准函数+With语句实 ...