{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

数据库分区是什么?

vboy1010vboy1010 回答0 收藏1
收藏问题

3条回答

huashiou

huashiou

回答于2022-06-28 14:08

关于数据库分区,分表,分库,我通俗易懂的来举几个栗子,看过还不懂,你打我。。。

村里一家四口人(老爹叫A)有两儿子(分别是A1,A2),长大了要自己种地了,就嚷嚷着要分家,把村东的一块地给大儿子A1,村西的给二儿子A2,但是这时候户口本上记录的还是一家四口(对外显示还是一家人),国土局统计村西土地面积的时候直接让A去汇报,然后A去让A2测量并汇报,不涉及到A1!

这就是分区:对外只展示一张表,但是表内部分区到不同的磁盘上,只需要其中一部分数据的时候可直接映射相应的区进行查找,避免了全表扫描,提升了查找,插入数据的性能,一般是数据库层面实现的,如下图所示:

分区可分为水平分区和垂直分区,通常水平分区用的比较多,算法有按照某个字段的大小等,某个字段的hash分等等!

啥是分表呢?还是上面那一家子,分家了之后,户口也变了,变成了三家,国土局让上报数据的时候,需要分别通知三家进行,比如只需要村西的统计,那么还是只用找二儿子A2就行了(三家已经是多带带的数据库表了)

分表:对外展示多张小表,业务代码访问之前,需要先通过计算分表策略算法,来选择具体访问哪一张表,和分区一样,避免了全表的访问,分表如下图示:

分库:跟分表有异曲同工之妙,但是分库的级别为数据库级别(按上面的例子,就得提升到村子级别了),简单来说就算是你一个库是关系型数据库,一个库是nosql数据库也是可以称为分库的,这对于库的引擎,连接方式都可以有不同的实现!

分库通常在不同的数据库服务节点上,避免单库宕机对全部数据服务带来的影响,同时也提供了更大的数据库并发能力!
关于分库,分表,分区是不是很简单?

现在分库分表使用的更加的广泛,业界也提供了大量成熟的数据库中间件来提供分库分表,比如mycat,sharding-jdbc等等,只需要根据业务选择合适的分库分表策略,结合相应组件就能轻松搭建起一个分库分表数据服务,不过随之而来的全局唯一数据,统计,连接查询等才是更加需要关注的,更多的技术分享,敬请关注。。。

评论0 赞同0
  •  加载中...
SmallBoyO

SmallBoyO

回答于2022-06-28 14:08

什么是分区?

数据库分区一般指的是数据库的表分区,下面我们以MYSQL为例来讲解数据库分区,其他数据库道理基本相同。分区表对用户来说是一个逻辑整体,但底层mysql将其分离为多个物理子表,分区对于sql来说是完全封装的,也就是对我们应用来说是透明的,不可见的,但从底层的文件系统来看,一个表被分割为多个子表文件,使用方法也很简单,在创建表时使用 partition by 子句定义分区表达式来存放数据。



mysql执行查询时候,优化器先根据分区表达式的定义来过滤无用的分区,执行sql时只需要查找包含需要的数据分区就可以了。

分区的原理?

分区表管理一组分区表和管理普通表一样,各个子表的索引也是上加了一个人完全相同的索引,从存储引擎来看,子表和一个独立的普通表没有任何区别,以下我们来看看当执行以下命令的时候mysql如何操作分区表的:

  • select :查询时,分区层打开并锁住所有子表,优化器先根据分区表达式过滤不需要的分区,然后调用存储引擎访问各个目标分区。
  • insert:写入时,分区层打开并锁住所有子表,根据分区表达式确认存放数据的分区是哪一个,再去指定分区插入记录。
  • delete:删除也是一样,还是先锁住所有分区,根据分区表达式确认数据在哪一个分区,再去那个分区删除记录。
  • update:更新时相对复杂一点,分区层打开并锁住所有子表,先根据分区表达式确认数据在哪一个分区,然后先取出数据并更新,再判断更新后的数据应该存放哪个分区,最后对目标分区写入数据,最后一步要对原始数据的分区表进行删除操作。


分区类型有哪些?

  • 范围分区:使用partition by range(列的表达式)来表示,使用最多的分区表类型,每个分区存储某个范围内的数据,比如:
  • 列表分区:使用 partition by list(列的表达式) 按离散值集合分区,这种分区类型类似于范围分区,例如:
  • 哈希分区:使用 partition by hash(列的表达式),按表达式的hashcode取模后分布到指定的区域,同理:


分区查询优化?

分区数据显而易见的好处是数据分块管理,大表拆小表,这样在操作数据的时候可以预先过滤掉不必要的数据,尽量控制在一个较小的数据区来查询数据。一个很重要的意见是:尽量在where条件中带入分区列查询,如果没有mysql就会扫描所有分区,我们可以使用expain patitions 来查看sql语句是否使用了分区过滤,如:


explain partitions select * from tuser

结果显示扫描的所有分区,我们再加上where条件:

explain partitions SELECT * from tuser where cid=2000

结果显示只扫描了一个分区。


为什么要使用数据分区?

  • 表数据非常大后使用索引的代价过大、表数据呈现明显的热点数据。
  • 分区表的数据更容易维护,可以多带带的针对子表进行优化和修复工作,也可以操作整个分区数据。
  • 分区子表的数据可以部署到不同的物理设备上,可以高效的利用多个硬件设备。
  • 由于一个大表数据分散到多个子表中,这样可以避免单个索引的互斥和锁的竞争。


常见的问题有哪些?

  • 一个表最多只能有1024个分区。
  • 分区过多可能会导致在进行分区重组(重组会涉及到临时数据表的复制和删除)、表数据更新、分区查找的时候开销过大。
  • 执行命令前mysql会锁住所有分区表,这个操作是在过滤分区和执行sql语句之前执行的,所以这个开销无法避免,最好的做法是控制分区表数量在100个以内
  • 分区表达式的返回值必须是整数。
  • 分区表无法使用外键。
  • null值会使分区过滤无效。
  • mysql5.5以后对分区表做了大范围的优化和bug修复,所以使用这个特性之前确保你mysql高于5.5版本。
  • 分区列和索引类不匹配,如果我们在某些列上创建了索引,但这些列又不参与分区,即 partition by 类型(列的表达式)子句不包含这些索引列,那么mysql在扫描这些索引的时候会遍历所有分区表的索引,除非where子句使用了分区列来查询,为了避免这个问题尽量使用索引列来分区,比如:
评论0 赞同0
  •  加载中...
sPeng

sPeng

回答于2022-06-28 14:08

数据分区是一种物理数据库的设计技术,它的目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。要搞清楚数据库分区,先要清楚一下问题

为什么要分区

在实际工作中随着业务的增长,我们的数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询速度变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。

也就是说当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。为了提高数据库性能,保证数据的准确无误以及安全性。所以要进行分区。

数据库分区的概念和原理

分区并不是生成新的数据表,而是将表的数据均衡分摊到不同的硬盘,系统或是不同服务器存储介子中,实际上还是一张表。


要实现这一功能,首先要了解数据库对水平分区表进行分区存储的原理。


为了方便理解数据分区,在这里先介绍一下分表的概念。分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的表名,然后去操作它。



数据库分区和分表相似,都是按照规则分解表。不同在于分表将大表分解若干个独立的实体表,而分区是将数据分段划分在多个位置存放,分区后,表还是一张表,但数据散列到多个位置了。应用程序读写的时候操作还是表名,DB自动去组织分区的数据。

所谓水平分区分表,就是把逻辑上的一个表,在物理上按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下。这样把一个大的文件拆分成多个小文件,便于我们对数据的管理。


数据库分区的优势

分区可以做到将表的数据均衡到不同的地方,提高数据检索的效率,降低数据库的频繁IO压力值,目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。

1、相对于单个文件系统或是硬盘,分区可以存储更多的数据;

2、数据管理比较方便,比如要清理或废弃某年的数据,就可以直接删除该日期的分区数据即可;

3、精准定位分区查询数据,不需要全表扫描查询,大大提高数据检索效率;

4、可跨多个分区磁盘查询,来提高查询的吞吐量;

5、在涉及聚合函数查询时,可以很容易进行数据的合并;



总结

分区确实能够带数据库性能的提高,运用也是非常广泛,但同时也有很多要注意的地方。在性能的考量上。并不是说分区越多,性能就越好。这些分区都会影响到内存的消耗,CPU的繁忙程度。所以你在使用分区的时候,要找到你的平衡点。还是那句话不用最好的,要用最适合的。看完有帮助的话麻烦点个赞,关注一下,欢迎留言评论。

评论0 赞同0
  •  加载中...

相关问题

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<