Android开发

MySQL 高级特性(二):数据表分区策略及优缺点分析

2022-07-07  本文已影响0人  岛上码农

假设需要对一个包含了数年历史数据、有价值的、基于时间序列的超级大的订单数据表进行范围查询。我们需要对近一个月的数据进行统计查询,这会涉及到一亿行数据。也许新的版本的 MySQL 能够支持,但是未来的数据量会更夸张,比如假设一个硬件应用产生的数据超过了10TB,这比服务器内存大多了,而服务器的硬件还是当前的一样,硬盘驱动器,Flash(SSD 硬盘目前还比较难达到存储这么大容量的级别),这个时候即便不考虑性能,又该如何进行查询?

为什么需要分区?

当面对巨大的数据表的时候,至少有一件事情是确定的,表太大了以至于每次查询的时候我们没法做全表扫描。而这个时候也没法使用索引,或者说索引意义不大,更不用说索引的维护代价和空间占用非常高。如果是依赖索引,会导致大量的碎片和低聚集度的数据,这会导致查询的时候有上千次的随机 I/O 访问而导致宕机。这种情况下一般只会使用1-2个索引,而不会更多。这种情况下,有两个可行的选项:查询必须从数据表的指定的部分顺序查找或者是期望的部分数据及其索引与服务器的内存匹配。

需要再次重申:在存储空间过大时,除非索引覆盖了整个查询,否则二叉树索引就无法发挥作用。服务端需要查找数据表的一整行数据,并且会在一个大空间跨度里执行随机 I/O 操作,这会导致查询响应时间无法接受。而维护索引(磁盘空间,I/O 操作)的代价同样很高。

而这是分区能够解决的问题。这其中的关键就是分区是索引的一个初级形式,它的负荷低并且能够让我们从临近的数据中获取结果。这种情形下,我们可以依次扫描相邻的数据或者是将临近的数据加载到内存进行检索。分区之所以负荷低是因为它并没有指针指向对应的数据行,也不需要被更新。分区并不精确地将数据按行划分,也没有涉及到所谓的数据结构。实际上,分区相当于对数据进行了分类。

分区的策略

对于大数据表,有两种策略进行分区:

分区隐患

两种分区策略是基于两个关键假设:在查询的时候可以通过过滤分区缩小查找范围,且分区自身的代价不高。然而,这两个假设未必总是有效,下面是可能遇到的问题:

如上所述,分区并不是完美解决方案,目前版本的 MySQL还有一些其他的约束:

当然,随着 MySQL 版本的更新迭代,对分区的支持也越来越好,并且很多分区的问题都得到了修复。

上一篇 下一篇

猜你喜欢

热点阅读