欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流
本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle
在前面的内容中,✅【SQL应知应会】表分区(一)• MySQL版、✅【SQL应知应会】表分区(二)• MySQL版、✅【SQL应知应会】表分区(三)• MySQL版以及✅【SQL应知应会】表分区(四)• MySQL版中,已经完成了MySQL的表分区方面的大部分知识的学习
今天这篇内容,将继续进行讲述MySQL的表分区的后续内容,主要包括 MySQL分区处理null值的方式、获取分区表信息的方法、分区表与非分区表的性能对比和分区的使用场景
希望文章的内容对大家有所帮助,如果有什么不足的地方,大家可以在评论区或者私信我,感谢大家的支持
那么,快拿出你的电脑,跟着文章一起学习起来吧
:传送门非分区表构
:传送门概念
:传送门InnoDB 逻辑存储结构
2.2.2 段(segment)
2.2.3 区(extent)
2.2.4 页(page)
:传送门MySQL数据库分区的由来
:传送门为什么对表进行分区
2.4.1 表分区要解决的问题
2.4.2 表分区有如下优点
:传送门MySQL的分区形式
2.5.1 水平分区(HorizontalPartitioning)
2.5.2 垂直分区(VerticalPartitioning)
2.6.1 range分区 :传送门range分区
2.6.2 list分区(列表分区)
2.6.3 hash分区
2.6.4 KEY表分区
2.6.5 多字段分区(range、list)
2.6.6 分区注意事项及适用场景
2.7.1range分区
2.7.2list分区
:传送门2.7.1~ 2.7.2
2.7.3 hash表分区
2.7.4 key表分区
2.7.5复合分区
2.7.5.1 range-hash(范围哈希)复合分区
2.7.5.2 list-hash(列表哈希)复合分区
:传送门2.7.3 ~ 2.7.5
2.7.5.3 range-key 复合分区
2.7.5.4 list - key 复合分区
:传送门2.7.5.3 ~ 2.7.5.4
:传送门常见分区操作
2.8.1 删除分区
2.8.2 增加分区
2.8.3 分解分区
2.8.4 合并分区
2.8.5 重新定义分区
2.8.6 重建分区
2.8.7 检查分区
2.8.8 修补分区
:传送门MySQL分区表的局限性
2.9.1 错误示例
2.9.2 错误修正
not null
约束
range
分区表,那么null行将被保存在范围最小的分区。list
分区表,那么null行将被保存到1ist为0的分区。HASH和KEY
分区的情况下,任何产生NULL值的表达式mysql都视同它的返回值为0.为了避免上述这种情况的产生,建议分区键设置成NOT MULL。
## show create table 表名
show create table foo_list
show table status like 'foo_range'
TABLE_SCHEMA : 分区表所在的数据库名称
TABLE_NAME : 分区表的名称
PARTITION_NAME : 分区的名称
SUBPARTITION_NAME : 子分区的名称
PARTITION_ORDINAL_POSITION : 分区在表中的位置,从1开始,会在分区添加,删除,重整使会发生编号
SUBPARTITION_ORDINAL_POSITION : 子分区在分区中的位置
PARTITION_METHOD : 分区类型,可以是RANGE,LIST,HASH,LINEAR HASH,KEY,or LINEAR KEY
SUBPARTITION_METHOD : 子分区的类型,可以是HASH,LINEAR HASH,KEY,or LINEAR KEY
PARTITION_EXPRESSION : 分区表达式信息,如PARTITION BY HASH(c1+c2)语句
PARTITION_DESCRIPTION : RANGE and LIST分区时有用,显示相关的定义信息,其他的类型值为NULL
CREATE_TIME : 建立的时间
UPDATE_TIME : 最后修改时间
PARTITION_COMMENT : 注释信息
select
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
from information_schema.partitions
where table_schema = schema()
and table_name = 'foo_range'
explain partitions select语句
create table part_tab
(
c1 int default null,
c2 varchar(30) default null,
c3 date not null
)
partition by range(year(c3))
(
partition p0 values less than (1995),
partition p1 values less than (1996),
partition p2 values less than (1997),
partition p3 values less than (1998),
partition p4 values less than (1999),
partition p5 values less than (2000),
partition p6 values less than (2001),
partition p7 values less than (2002),
partition p8 values less than (2003),
partition p9 values less than (2004),
partition p10 values less than (2010),
partition p11 values less than (maxvalue)
)
create table no_part_tab
(
c1 int default null,
c2 varchar(30) default null,
c3 date not null
)
create procedure load_part_tab()
begin
declare v in default 0;
while v < 8000000
do
insert into part_tab
values(v,'testingpartitions',adddate('1995-01-01',(rand(v)*36520)mod 3652))
set v = v + 1;
end while;
end;
call load_part_tab();
insert into no_part_tab select * from part_tab
select count(*) from part_tab
where c3 > date '1995-01-01'
and c3 < date '1995-12-31';
select count(*) from no_part_tab
where c3 > date '1995-01-01'
and c3 < date '1995-12-31';
explain
select count(*) from part_tab
where c3 > date '1995-01-01'
and c3 < date '1995-12-31';
explain
select count(*) from no_part_tab
where c3 > date '1995-01-01'
and c3 < date '1995-12-31';
总结: 可伸缩性,可管理性,提高数据库查询效率。
感谢大家耐心的看完这篇文章,对于SQL在表分区的知识点,我们在MySQL方面已经有五篇内容了,而我们对于MySQL的分区通过这五篇内容也终于可以✅告一段落了
如果大家觉着还算可以,那么就给个三连支持一下吧,如果想要继续关注和学习后续更多的内容,就关注一下爱书不爱输的程序猿吧,当然,如果大家还有什么其他方面的知识点想要看,可以在评论区或者私信我