mysql 数据库性能提升,分表分区请收藏

本贴最后更新于 1388 天前,其中的信息可能已经时过境迁

现在企业中,数据库选择用mysql的还是非常非常多的,公司比较规范的,在立项之初,就会认真讨论数据库的设计,而更多的中小微企业,可能就不会那么系统性的讨论数据库的设计了。

但是,不管怎么样,随着数据量的增加,或迟或早,都会遇到数据库性能瓶颈。数据库性能问题,套上那句话“不是没有,只是时机未到”。当数据量比较少时,基本不会有性能问题,在数据量比较多时,性能问题就会出现了。

今天,我们不是讨论使用层面上怎么优化脚本,我们讲讲数据库的设计,分表和分区,通过对某些特定的表减负,缩短查询时间,从而提高性能。

分表

分表,从字面上理解,就是把原本在一张表中的数据,分开到多张实体表中。基于这样的理解,其实现方式常见有两种:垂直切分、水平分表

垂直分表

垂直分表,是指对原始表的进行拆分,根据一定的拆分规则,把一张表的列,拆分成多张表。如:把原始表中不常用的列拆分到一张表,把一些存储大数据量的字符拆分到一张表,把经常一起使用的列拆分到一张表,......等等。这样拆分的多张表,每张表都可以有自己的存储引擎、索引等,使用灵活,性能也可以得到提升。

按照这样的理解,大家见的比较多的‘视图’也是一种分表。

但是,注意,垂直分表,只是拆分了原始表的列,没有减少表的行,原来是多少行,还是多少行。

在企业中,对表垂直拆分一般都是开发人员或架构师,对业务比较熟悉的人执行。

水平分表

水平分表,最容易理解的是指对原始表的进行拆分,根据一定的拆分规则,把原先存在一张表的数据,分表存储到多张表中。如:根据id取模,hash值、按日期月份...等等。

这样,原本存储在一张表中数据,被分开存储在不同的表中,大大降低了单表的数据量。

-- 根据原表中id不同,插入到不同子表中
insert into 分表1(id,colname,.....) select id, colname,...... from 原表 where id%2=0;
insert into 分表2(id,colname,.....) select id, colname,...... from 原表 where id%2=1;

另外一种水平分表,可能不是那么好理解,数据库集群或者说主从同步,读写分离。这样也是可以提升数据库性能的。

分区

分区和分表类似,不同的是,分表,是把原始表分成多个子实体表;而分区是将原始表的数据划分到多个位置存放,表还是一张表,只是数据分布在多个地方。

垂直分区

垂直分区(VerticalPartitioning),根据表中的列,进行垂直划分,使某些特定的列数据被集中在某一个分区中。如:根据数据列使用频率

水平分区

水平分区(HorizontalPartitioning),根据表的行进行分区,把表中满足某些特性的数据,集中保存在某一个分区中。如:按存储年份分区

mysql 5.7版本,可以执行 show plugins; 查看数据库是否支持分区,partition为ACTIVE,表示支持分区

mysqlpartition20210202172552.png

分区的优势

回帖
请输入回帖内容 ...