本文主要向大家介绍了MySQL数据库之MySQL的分区和分表详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。

1. 分区

MySQL中的分区是指将一个数据表按照某种规则(如时间范围、哈希等),划分为多个区块,各个区块所属的数据文件是相互独立的。分区对于SQL层来说,是一个完全封装的、底层实现的黑盒子;但对于底层的文件系统来说,每一个区块都对应 一个使用 # 分割命名的表文件。

分区的一个主要目的是将数据按照一个较粗的粒度划分到不同的分区表中,这样,可以将相关的数据存放在一起,另外,如果想一次删除整个分区的数据也会变得非常方便。

分区的应用场景:

表的数据量非常大或者只在表的最后部分有热点数据,其他都是历史数据或冷数据。

批量删除大量数据,可以使用删除整个分区的方式。

分区表的数据可以分布到不同的磁盘上,从而高效地利用多个硬件设备。

可以对独立的分区进行优化、检查、修复、备份和恢复等操作,易于维护。

分区的局限性:

一个表最多只能有1024个分区。

表中如果有主键或唯一索引,则必须包含到分区字段中。

分区表中无法使用外键。

所有分区都必须使用相同的存储引擎。

某些存储引擎不支持分区。

在创建表时,使用?PARTITION BY?子句,来定义每个分区中存放的数据。

在执行查询操作时,优化器会根据分区的定义过滤掉那些没有我们所要数据的分区,这样,查询就不会扫描所有分区,只查找包含我们所要数据的分区就可以了。

分区的类型:

范围分区(PARTITION BY RANGE 或 PARTITION BY RANGE COLUMNS)

列表分区(PARTITION BY LIST)

哈希分区(PARTITION BY HASH)

索引分区(PARTITION BY KEY)

对于 RANGE 或 LIST 类型的分区,还支持子分区 SUBPARTITION,不过,生产环境中很少见。

1.1 范围分区

MySQL支持多种分区表,最常见的就是根据范围进行分区。

根据范围分区时,每个分区存储指定范围的数据,分区表达式可以是列(字段),也可以是包含列的表达式。

根据范围分区时,范围应该连续但是不重叠,使用PARTITION BY RANGE, VALUES LESS THAN关键字。不使用COLUMNS关键字时RANGE括号内必须为整数字段名或返回确定整数的函数。

下面就是一个将日志记录表 log_1 根据时间范围来分区的例子。

根据具体的年份:

1

2

3

4

5

6

7

8

9

10create table ifnot exists log_1 (

contentvarchar(200)not null default '' COMMENT'日志内容',

create_time datetimenot null default CURRENT_TIMESTAMP COMMENT'创建时间',

KEY create_time (create_time)

) ENGINE=InnoDBDEFAULT CHARSET=utf8 COMMENT='日志记录表' PARTITIONBY RANGE(YEAR(create_time))(

PARTITION p_nullVALUES LESS THAN (2017),

PARTITION p_2017VALUES LESS THAN (2018),

PARTITION p_2018VALUES LESS THAN (2019),

PARTITION p_2019VALUES LESS THAN (2020),

PARTITION p_finalVALUES LESS THAN MAXVALUE);

根据时间戳:1

2

3

4

5

6PARTITIONBY RANGE ( UNIX_TIMESTAMP(create_time) ) (

PARTITION p0VALUES LESS THAN ( UNIX_TIMESTAMP('2017-01-01 00:00:00') ),

PARTITION p1VALUES LESS THAN ( UNIX_TIMESTAMP('2017-04-01 00:00:00') ),

PARTITION p2VALUES LESS THAN ( UNIX_TIMESTAMP('2017-07-01 00:00:00') ),

PARTITION p3VALUES LESS THAN ( MAXVALUE )

);

根据COLUMNS关键字:

添加COLUMNS关键字可定义非integer范围及多列范围,不过需要注意COLUMNS括号内只能是列名,不支持函数;多列范围时,多列范围必须呈递增趋势。1

2

3

4

5

6

7PARTITIONBY RANGE COLUMNS( create_time ) (

PARTITION p0VALUES LESS THAN ('2017-01-01 00:00:00'),

PARTITION p1VALUES LESS THAN ('2018-01-01 00:00:00'),

PARTITION p2VALUES LESS THAN ('2019-01-01 00:00:00'),

PARTITION p3VALUES LESS THAN ('2020-01-01 00:00:00'),

PARTITION p4VALUES LESS THAN MAXVALUE

);

1.2 列表分区

根据具体数值分区,每个分区数值不重叠,使用PARTITION BY LIST、VALUES IN关键字。跟Range分区类似,不使用COLUMNS关键字时List括号内必须为整数字段名或返回确定整数的函数。1

2

3

4

5

6PARTITIONBY LIST(cate_id) (

PARTITION p1VALUES IN (1,2,3),

PARTITION p2VALUES IN (4,5,6),

PARTITION p3VALUES IN (7,8,9),

PARTITION p4VALUES IN (10,11,12)

);

注意:?所有的数值都必须被分区,否则插入一个不属于任何一个分区的数值会报错。

1.3 哈希分区

Hash分区主要用来确保数据在预先确定数目的分区中平均分布,Hash括号内只能是整数列或返回确定整数的函数,实际上就是使用返回的整数对分区数取模。1

2PARTITIONBY HASH(YEAR(creat_time) )

PARTITIONS 4;

Hash分区也存在与传统Hash分表一样的问题,可扩展性差。MySQL提供了一个类似于一致Hash的分区方法--线性Hash分区,只需要在定义分区时添加LINEAR关键字。1

2PARTITIONBY LINEAR HASH(YEAR(creat_time) )

PARTITIONS 4;

1.4 索引分区

Key分区与Hash分区很相似,只是函数不同,定义时把Hash关键字替换成Key即可,同样Key分区也有对应与线性Hash的线性Key分区方法。1

2PARTITIONBY LINEARKEY (id)

PARTITIONS 4;

分区查询优化:

分区给查询优化带来了新的思路。分区的最大优点就是优化器可以根据分区的定义过滤掉一些分区。可以把分区当作是一种粗粒度的索引策略。

查询分区表时,必须在WHERE条件中加入分区列(即使看似多余的也要带上),这样就可以让优化器过滤掉无须访问的分区。

使用?EXPLAIN PARTITIONS?可以检查优化器是否进行了分区过滤。1EXPLAIN PARTITIONSSELECT *FROM log_1

上面这个查询语句将访问所有的分区,效率很低。下面,我们加入一个where条件。1EXPLAIN PARTITIONSSELECT *FROM log_1WHERE create_time>'2017-01-01' AND create_time<='2017-12-31'

这时,查询就只会访问 p_2017 分区,而过滤掉其他分区。

注意:?MySQL只能在使用分区函数的列本身进行WHERE比较时才能过滤分区,而不能根据表达式的值来来过滤分区。

下面这条查询语句就无法过滤分区:1EXPLAIN PARTITIONSSELECT *FROM log_1WHERE YEAR(create_time)=2017

这和查询语句中使用独立的列才能用到索引的道理是一样的。

2. 分表

2.1 合并表(Merge table)

合并表属于分表的一种方式,和分区表类似,在MyISAM中,各个子表被一个结构完全相同的逻辑表所封装,但合并表允许用户直接访问各个子表。而分区表的子表(分区)都是被MySQL隐藏的,只能通过分区表去访问子表。

合并表相当于一个容器,里面包含了多个真实的子表。

创建合并表时,使用?UNION?关键字来指定合并表中包含哪些子表。合并表必须采用?MERGE?引擎。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17# 子表t1

create table t1(

idint not null primary key,

name char(10)not null,

)ENGINE=MyISAM;

# 子表t2

create table t2(

idint not null primary key,

name char(10)not null,

)ENGINE=MyISAM;

# 合并表m

create table mrg(

idint not null primary key,

name char(10)not null,

)ENGINE=MERGE UINON(t1,t2) INSERT_METHOD=LAST;

INSERT_METHOD=LAST语法的作用是将所有的INSERT语句都发送给最后一个子表。FIRST或LAST关键字,可以控制将数据插入到合并表中的哪一个子表。当然,也可以直接在SQL中操作子表。

2.2 切分表

切分表是指将表中的数据按照水平分割或垂直分割的方式分配到多张表中。

通常,我们所说的分表是指水平分割,也就是传统的分表技术。

常用的分表方法有:

范围分表

哈希分表

分表后,如果想对总数据进行统计(count、sum等),只能对所有子表统计后,再在应用层再次计算得出最后的统计数据。而分区则不受影响,直接统计分区表即可。

也就是说,分表后,原来的应用层代码需要做较大的改动。

本文由职坐标整理并发布,希望对同学们学习MySQL有所帮助,更多内容请关注职坐标数据库MySQL数据库频道!

mysql数据库表分区_MySQL数据库之MySQL的分区和分表详解相关推荐

  1. mysql创建备份表脚本_MySQL 备份脚本(单库/分库分表)

    MySQL数据库分库备份 数据库密码保存在/etc/my.cnf文件中,所以在执行与mysql相关的命令不需要输入密码 分库备份思路: mysqldump db1 >db1.sql.gz mys ...

  2. mysql ssd 性能测试 写入_MySQL服务器的SSD性能问题分析和测试详解

    [问题] 我们有台HP的服务器,SSD在写IOPS约5000时,%util达到80%以上,那么这块SSD的性能究竟有没有问题,为解决这个问题做了下面测试. [工具] blktrace是linux下用来 ...

  3. mysql 带宽测试工具_MySQL自带的性能压力测试工具mysqlslap详解

    使用语法如下: # MySQLslap [options] 常用参数 [options] 详细说明: --auto-generate-sql, -a 自动生成测试表和数据,表示用mysqlslap工具 ...

  4. mysql工具使用意义_MySQL性能分析、及调优工具使用详解

    本文汇总了MySQL DBA日常工作中用到的些工具,方便初学者,也便于自己查阅. 先介绍下基础设施(CPU.IO.网络等)检查的工具: vmstat.sar(sysstat工具包).mpstat.op ...

  5. mysql排他锁释放_Mysql 共享锁、排他锁 与 事务隔离级别详解

    共享锁.排他锁 InnoDB 实现了两种类型的锁机制:共享锁(S)和排他锁(X).共享锁允许一个事务读数据,不允许修改数据,如果其他事务要再对该行加锁,只能加共享锁:排他锁是修改数据时加的锁,可以读取 ...

  6. mysql数据库建新分区_mysql数据库分区

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

  7. mysql数据库的原则_mysql数据库的表设计原则

    [职责分离原则] 职责分离原则是指在设计的时候应当考虑到数据的产生,聚合使用等原则,每个系统干自己能干的事情,每个系统只干自己的事情.一个数据表应该放在哪个系统中,通常取决于几点: 1. 谁产生这个信 ...

  8. mysql 数据库分表查询_mysql数据库分表及实现

    项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. 当出现这种情况时,我们可以考虑分表,即将单 ...

  9. MySQL数据库知识学习(五)读写分离与分库分表策略

    通过数据库锁及存储引擎的学习,我们知道数据库在数据操作过程中为了保证数据的一致性是会给表或行加锁的,在网站发展的初期,由于没有太多访问量,一般来讲只需要一台服务器就够了,这的操作也不会有什么问题.但随 ...

  10. mysql数据库开发要求_MYSQL数据库开发规范

    MYSQL数据库开发规范 (一) 建表规约 1.[推荐]表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint ( 1 表示是,0 表示否). 说明:任 ...

最新文章

  1. Linux 下ntpdate网络校时使用
  2. 云服务双十一大促,最后选手阿里云上场!没有让等到最后的用户失望!
  3. 有关css和js针对不同浏览器兼容的问题
  4. 【SSH】——Hibernate三种状态之间的转化
  5. PhotoshopCS6-视觉特效插画技法-15-磨砂金属效果分析
  6. 【Java】反射、枚举、Lambda表达式
  7. CANFD和CAN的区别简介
  8. 网页导出pdf不完整_网页怎么打印成PDF文件?使用这款工具轻松实现
  9. centos安装nginx配置webpy
  10. 莫比乌斯反演入门题目(详细)
  11. 聚观早报 | iPhone 14 系列发布黄色新配色;微信能用支付宝钱包了
  12. 离线语音智能家居控制
  13. 蓝桥杯真题(路径)C语言
  14. [Pytorch图像分类全流程实战]Task06:可解释性分析
  15. HttpClient 设置cookie的问题
  16. 决策树与K-近邻分类随堂笔记(二)
  17. 日均线,60日线,根据60线看行情,什么是多头排列
  18. 利用Hound快速搭建代码搜索引擎
  19. 了解TypeScript装饰器
  20. C语言经典项目开发——连连看小游戏

热门文章

  1. 目标检测——初始学习率设置的学习笔记
  2. 自动驾驶——标注工具的开发笔记(legacy)
  3. pandas 多线程处理数据框
  4. 爬取京东评论、分词+词频统计、词云图展示
  5. ROS学习笔记十二:使用roswtf
  6. 【map分组求和】map集合根据某一key分组,再对某一key对应的所有值求和
  7. 【牛腩1】--- 服务器错误:编译错误
  8. 使用NodeJS连接到MySQL数据库Client does not support authentication protocol requested by server; consider upg
  9. Java求三个数中的最大值
  10. Python-将一个列表的数据复制到另一个列表中