周末美好的闲暇时光,可大多人都在床上与之度过。怎么说呢? 时间这东西,只有你看到重,它才会有重量。但对应烦恼也只有你知道! 所以今天开始新篇章分享---MySQL高级特性中的分区
特别通知:今天是母亲节呀! 大家要记得这个神圣的日子
在这里,我吒吒辉得要报告下,因篇幅短小,无法融会贯通全部分享出来,故后面会推出详细完整的内容,所以得麻烦你关注下!✧(^_-✿
MySQL高级特性,那都是面试中常被考查。解决并发优化问题,隶属家常菜
这分区表是个啥?
分区表是一个独立的逻辑表,底层由多个物理表组成。实现代码实际是一组底层表的句柄对象。分区的一个主要目的是将大量的数据集按照一个较粗的粒度分散在不同的表中,从而减少每次查询结果集的总量。
可能有人不清楚,这个表怎么存储?句柄对象是什么东西?
如上,表数据还是都存储在同一台数据库下,对应用层而言是一个完整的数据表,在存储引擎来看,就是把一张表里的数据分散到多个分区表(小表)存储。查找数据时根据每个分区的句柄对象,调用存储引擎接口去读取磁盘下的数据。
句柄对象嘛,大家可理解为文件系统的操作对象,获取数据时直接调用接口。
这能解决什么问题?
如果一张表数据 达到10亿行,10TB多数据时,再用索引查找就不能解决问题,因为你内存不能存下这么多数据。每次查询即使有索引也会有大量的随机I/O,或者直接走全表扫描去了。本身索引维护也是需要资源开销的。
为什么会有会有随机I/O呢?索引不都是顺序查找吗?
因为你的B+Tree有高度比较矮,虽可多存储数据,但还是不能容纳下亿级的数据,如果不在你第一次的索引树下,那又得重新查找其它索引树,这样是不是就随机查找啦!至少都是成千上万的。
所以就从数据的拆分来做到治理,和水平划分有点相似。 o( ̄ ̄)d
那这个东西,我要如何使用?
在建表语句后加入 PARTITION BY 来定义分区类型,常用的是 RANGE 分区。
CREATE TABLE sales (
order_date DATETIME NOT NULL,
Other columns omitted
) ENGINE=InnoDB PARTITION BY RANGE(YEAR(order date)) (
PARTITION p_2020 VALUES LESS THAN (2020),
PARTITION p_2021 VALUES LESS THAN (2021),
PARTITION p_2022 VALUES LESS THAN (2022),
PARTITION p catchall VALUES LESS THAN MAXVALUE );
上面在建表的时候设计,但一般使用该方案,都是在表里面已经存储了很多数据考虑的,针对后者采用
Alter Table 修改数据表为分区表就可以。
ALTER TABLE tbl_data PARTITION BY RANGE (Month(fld_date))
(
PARTITION p_Apr VALUES LESS THAN (TO_DAYS('2020-05-01')),
PARTITION p_May VALUES LESS THAN (TO_DAYS('2020-06-01')),
PARTITION p_Dec VALUES LESS THAN MAXVALUE );
如下是其它分区类型:
RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
如: PARTITION p_2012 VALUES IN (4,12,13,14,18)
HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
如: PARTITION BY LINEAR HASH(YEAR(order_date))
KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且为MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
如:PARTITION BY LINEAR KEY (col1)
如有帮助,欢迎关注@三头六臂哪咤
公众搜索:莲花童子哪吒