随着项目的发展,数据库的单表数据也越来越多,相关操作也就越来越慢,这个时候我们要怎么才能提高我们的相关操作效率呢?很多人都听说过分库分表,但是还有一个分区的方式可能被忽略了,在数据量还未达到千万级别的时候,我们也许还能够使用分区的方式,让一个表的数据分布在不同的文件上面,当然我们要清楚我们的表数据都是按照文件的方式存放在磁盘上面的,分区和分表是不同的意思,分区是指将一个表的数据按照条件分布到不同的文件上面,未分区前都是存放在一个文件上面的,但是它还是指向的同一张表,只是把数据分散到了不同文件而已,但是分表却是将数据分散到了不同的表,结构虽然相同,但是表的名字发生了变化。分区有助于我们降低每次操作的数据,从而提高性能。
遇到这种大数据量的问题,我们可以通过以下思路进行解决:
1.分流(原则就是:尽量使每次操作的数据的基数减少 ):
1.1.用和不用、常用和不常用分开。
1.2.对数据库存放的数据:分区、分库、分表 。
1.3.对文件存放的数据:拆文件。
1.4.考虑分批处理。
2.缓存技术:读多写少用缓存。
3.数据库优化:合理设计数据库结构、合理构建索引、数据库集群 。
4.处理优化:优化Sql、考虑使用临时表、中间表。
5.合理使用NoSql:Mongodb、Redis、HBase等 。
6.分布式大数据处理方案 :Hadoop、Spark、Storm等。
这里我们主要需要了解的是表如何进行分区,分区有什么优缺点以及分区又有哪些注意事项。这里我们是以mysql进行举例。
我们首先看下分区有什么优缺点:
1.优点:
• 进行逻辑数据分割,分割数据能够有多个不同的物理文件路径
接下来我们看下的分区方式:
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时,分区的列是两种中的一个组成部分