目录
Mysql日期格式转化问题_Cat凯94的博客-CSDN博客
基本概念
- 分区:(单节点层面)把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,但在逻辑上依然是一个整体,开发人员在数据操作时仍然是对这个整体大表进行操作,之后由数据库底层自己去寻找对应的分区进行操作,数据库底层寻找分区这个过程对开发人员来说是透明的,这样在数据操作时可以只对特定分区操作以提高效率
- 分库分表:单张表过大,把一张表分成多个小表,而分库是指:分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此需要对数据库进行拆分,从而提高数据库写入能力,即分库
- 分片:分库+分表,分片是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题
分区
分区就是将表物理截断,但在逻辑上依然是一个整体,开发人员在数据操作时仍然是对这个整体大表进行操作,之后由数据库底层自己去寻找对应的分区进行操作,数据库底层寻找分区这个过程对开发人员来说是透明的,这样在数据操作时可以只对特定分区操作以提高效率,存储时也可以将不同分区的物理文件分开存放
分类
垂直分区(VerticalPartitioning)
这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应所有行。
分区的作用:数据库性能的提升和简化数据管理,在扫描操作中,mysql优化器只扫描保护数据的那个分区以减少扫描范围获得性能的提高。
水平分区(HorizontalPartitioning)
这种形式的分区是对根据表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。
所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。水平分区一定要通过某个属性列来分割。常见的比如年份,日期等。具体有以下几种方法:
- RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
- LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
- HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
- KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
- 子分区(复合分区):采用range分区或者list分区的表,进行二次分区,二次分区只能为hash分区或者key分区。这种分区方式有两种建表写法,一种是指定子分区名,一种是不指定子分区名由系统默认。
-
columns分区:包含range columns和list columns两种,分区字段可以不为整型,可以有多个
优点
- 扩容:与单个磁盘或文件系统分区相比,可以存储更多的数据。
- 便于增删:对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。
- 便于查询:一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
- 便于函数并行查询:涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
- 提高吞吐量:通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。
不足
- 一个表最多只能有1024个分区。
- MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。
- 如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。
- 分区表中无法使用外键约束。
- MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。
分库分表
当单台MySQL请求数太高,数据查询慢,数据量太大,遇到IO瓶颈时,为了避免单库由于压力过高,导致出现上述所说的一系列问题,因而需要分库分表
标准
- 存储占用100G+
- 数据增量每天200w+
- 单表条数1亿条+
分表
当一个表字段过多时,应当考虑垂直分表方案,将多余的字段拆分到不同的表中存储。当一个表的数据过多时,或者数据增长速率过快时,应当考虑通过水平分表方案,来降低单表的数据行数。
- 垂直分表
- 水平分表
垂直分表
单表字段分为冷字段和热字段,并且做好映射
水平分表
一般要求控制在500-1200W
之间为一张表
分库
一个库一般最多支撑到并发 2000,一定要扩容了,而且一个健康的单库并发值你最好保持在每秒 1000 左右,不要太大。
- 垂直分库:结构不同,数据不同(库级别)
- 水平分库:结构相同,数据不同(库级别)
优点
- 能够得到最大的性能收益,吞吐量会随机器数量呈直线性增长。
- 能够最大程度上保障存储层的高可用,任意节点宕机都不会影响整体业务的运转。
- 具备相当强的容错率,当一个库中的结构存在问题需要重构时,无需将所有业务停机更新。
- 具备高稳定性,分库+配备完善的监控重启策略后,基本上能确保线上无需人工介入管理。
不足
带来一系列增删改查的隐患
(二十二)全解MySQL之分库分表后带来的“副作用”一站式解决方案! - 掘金 (juejin.cn)