
本文共 1613 字,大约阅读时间需要 5 分钟。
-
数据库分区(Database partition)
数据库分区是一种物理数据库设计技术,主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
把一张表的数据分成N个区块,在逻辑上看最终还是一张表,但底层是由N个物理区块组成。
系统读写时,操作的还是大表名字,db自动组织分区的数据。
-
分区形式主要有两种
-
水平分区(Horizontal Partitioning)
水平分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合。
所有表中定义的列在每个数据集中都能找到。
-
垂直分区(Vertical Partitioning)
垂直分区是对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区。
每个分区都包含了其中的列所对应的行。
-
-
分区的类型:
- Range:把连续区间按范围划分;
- List:把离散值分成集合,按集合划分,适合有固定取值列的表;
- Hash:随机分配,分区数固定
- Key:类似Hash,区别时只支持1列或多列,且mysql提供自身的hash函数
-
数据库分表
当一张表内的数据极大,查询一次所花费的时间成本就高,分表的目的就是减少数据库的负担,缩短查询时间。
把一张表按一定的规则分解成N个具有独立存储空间的实体表。每个表都对应三个文件:
.MYD数据文件
、.MYI索引文件
、.frm表结构文件
。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。系统读写时根据定义好的规则得到对应的子表名,然后操作它。
-
数据库分库
在单台数据库服务器性能足够的情况下,分库对于数据库性能时没有影响的。
在数据库存储上,
database
只起到一个namespace
的作用。database
中的表文件存储在一个以database名
命名的文件夹中,比如例子中的employees数据库:在操作系统中看到的样子是:
# haitian at haitian-coder.local in /usr/local/var/mysql/employees on git:master ● [21:19:47]→ ls db.opt dept_emp.frm dept_manager.ibd salaries.frm titles.ibddepartments.frm dept_emp.ibd employees.frm salaries.ibddepartments.ibd dept_manager.frm employees.ibd titles.frm
也就是说
database
并不是文件,只是起到namespace
的作用。所以MySQL
对于database
大小自然也就没有限制,而且对里面的表数量也没有限制。所以,分库的原因是?
为了解决单台服务器的性能,当单台服务器无法支撑当前的数据量时,就需要根据业务逻辑紧密程度把表分成几部分,分别放在不同的数据库服务器中以降低单台服务器的负载。
分库一般时垂直切分,除非垂直切分后,数据量仍然过多超过单台服务器的负载,才会考虑水平切分。
分库的缺点是,拆分后跨数据库无法连表查询。
-
分库与分表与分区的关系
分库与分表都是在应用层实现,拆分后都需要对原有系统进行很大的调整以适应新拆分后的库或表。比如实现一个SQL中间件、原本的连表查询改成两次查询、实现一个全局主键生成器等。
分区表实在数据库层面,MySQL自己实现的分表功能,很大程度上简化了分表的难度,分区表对于原有的应用层来说可以不做变化。
-
数据库分片
更确切来说,应该是数据分片。
数据库分库、分表、分区都是指对数据库进行操作,分片更多的是针对数据本身进行操作。
在分布式存储系统中,数据需要分散存储在堕胎设备上,数据分片(Sharding)就是用来确定数据在堕胎存储设备上分布的技术。
未完待续
-
References
发表评论
最新留言
关于作者
