数据库存储之表分区

       随着项目的发展,数据库的单表数据也越来越多,相关操作也就越来越慢,这个时候我们要怎么才能提高我们的相关操作效率呢?很多人都听说过分库分表,但是还有一个分区的方式可能被忽略了,在数据量还未达到千万级别的时候,我们也许还能够使用分区的方式,让一个表的数据分布在不同的文件上面,当然我们要清楚我们的表数据都是按照文件的方式存放在磁盘上面的,分区和分表是不同的意思,分区是指将一个表的数据按照条件分布到不同的文件上面,未分区前都是存放在一个文件上面的,但是它还是指向的同一张表,只是把数据分散到了不同文件而已,但是分表却是将数据分散到了不同的表,结构虽然相同,但是表的名字发生了变化。分区有助于我们降低每次操作的数据,从而提高性能。

       遇到这种大数据量的问题,我们可以通过以下思路进行解决:

       1.分流(原则就是:尽量使每次操作的数据的基数减少 ):

       1.1.用和不用、常用和不常用分开。

       1.2.对数据库存放的数据:分区、分库、分表 。

       1.3.对文件存放的数据:拆文件。

       1.4.考虑分批处理。

       2.缓存技术:读多写少用缓存。

       3.数据库优化:合理设计数据库结构、合理构建索引、数据库集群 。

       4.处理优化:优化Sql、考虑使用临时表、中间表。

       5.合理使用NoSql:Mongodb、Redis、HBase等 。

       6.分布式大数据处理方案 :Hadoop、Spark、Storm等。

       这里我们主要需要了解的是表如何进行分区,分区有什么优缺点以及分区又有哪些注意事项。这里我们是以mysql进行举例。

       我们首先看下分区有什么优缺点:

       1.优点:

        • 进行逻辑数据分割,分割数据能够有多个不同的物理文件路径

       • 可以存储更多的数据,突破系统单个文件最大限制  
 
       • 提升性能,提高每个分区的读写速度,提高分区范围查询的速度
 
       • 可以通过删除相关分区来快速删除数据
 
       • 通过跨多个磁盘来分散数据查询,从而提高磁盘I/O的性能
 
       • 涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理
 
       • 可以备份和恢复独立的分区,这对大数据量很有好处
 
       2.缺点:
       
      MySQL支持大部分的存储引擎创建分区,如MyISAM、InnoDB等。
 
      不支持MERGE和CSV等来创建分区。
 
      • 同一个分区表中的所有分区必须是同一个存储引擎。

      接下来我们看下的分区方式:

      1.RANGE分区:给定一个连续区间的列值 。

       创建方式如下:

CREATE TABLE tbl_users1 (
	uuid INT NOT NULL,
	name VARCHAR(20),
	registerTime VARCHAR(100)
)
PARTITION BY RANGE (uuid) (
	PARTITION p0 VALUES LESS THAN (5),
	PARTITION p1 VALUES LESS THAN (10),
	PARTITION p2 VALUES LESS THAN (15),
	PARTITION p3 VALUES LESS THAN MAXVALUE
);

       2.LIST分区:LIST是列值匹配一个离散值集合中的某个值来进行选择。

       创建方式如下:

CREATE TABLE tbl_users2 (
	uuid INT NOT NULL,
	name VARCHAR(20),
	registerTime VARCHAR(100)
)

PARTITION BY List (uuid) (
	PARTITION p0 VALUES in (1,2,3,5),
	PARTITION p1 VALUES in (7,9,10),
	PARTITION p2 VALUES in (11,15)
);

       3.HASH分区:用户定义的表达式的返回值来进行hash计算之后选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算,这个函数必须产生非负整数值。

       创建方式如下:

CREATE TABLE tbl_users4 (
	uuid INT NOT NULL,
	name VARCHAR(20),
	registerTime VARCHAR(100)
)
PARTITION BY HASH (uuid) //uuid可以添加表达式,比如/2,或者mod(uuid,2),性能低,每条数据要计算之后在hash然后再插入
	PARTITIONS 3;

       4.KEY分区:类似于按HASH分区,由MySQL服务器提供其自身的哈希函数。

       创建方式如下:

CREATE TABLE tbl_users5 (
	uuid INT NOT NULL,
	name VARCHAR(20),
	registerTime VARCHAR(100)
)
PARTITION BY LINEAR Key (uuid)
PARTITIONS 3;

       在后面一篇文章中我们将专门介绍分区操作,这里不再赘述。在分区的时候我们需要注意以下情况:

       1.如果表中存在primary key或者unique key时,分区的列是两种中的一个组成部分

       2.如果表中不存在任何的primary key或者unique key,则可以指定任何一个列作为分区列
 
       3.5.5版本前的Range、List、Hash分区要求分区键必须是int;MySQL5.5及以上,支持非整型的Range 和List分区,即:range columns 和list columns。
      
       4. MySQL中的分区在禁止空值NULL上没有进行处理,无论它是一个列值还是一个用户定义表达式的值,一 般而言,在这种情况下MySQL把NULL视为0。如果你希望回避这种做法,应该在设计表时声明列“NOT NULL”。
 
      最后看下它的注意事项:
      
       最大分区数目不能超过1024,一般建议对单表的分区数不要超过150个。
       如果含有唯一索引或者主键,则分区列必须包含在所有的唯一索引或者主键之内。
       不支持外键。
       不支持全文索引,对分区表的分区键创建索引,那么这个索引也将被分区。
       按日期进行分区很合适,因为很多日期函数可以用。但是对于字符串来说合适的分区函数不太多。
       只有RANG和LIST分区能进行子分区,HASH和KEY分区不能进行子分区。
       分区表对于单条记录的查询没有优势。
       要注意选择分区的成本,每插入一行数据都需要按照表达式筛选插入的分区。
       分区字段尽量不要可以为null。
       分区的名字基本上遵循其他MySQL标识符应当遵循的原则,例如用于表和数据库名字的标识符。但 是应当注意,分区的名字是不区分大小写的。
       无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值