【SQL应知应会】表分区(五)• MySQL版

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【SQL应知应会】表分区(五)• MySQL版

前言

在前面的内容中,✅【SQL应知应会】表分区(一)• MySQL版、✅【SQL应知应会】表分区(二)• MySQL版、✅【SQL应知应会】表分区(三)• MySQL版以及✅【SQL应知应会】表分区(四)• MySQL版中,已经完成了MySQL的表分区方面的大部分知识的学习

🆗今天这篇内容,将继续进行讲述MySQL的表分区的后续内容,主要包括 MySQL分区处理null值的方式、获取分区表信息的方法、分区表与非分区表的性能对比和分区的使用场景

希望文章的内容对大家有所帮助,如果有什么不足的地方,大家可以在评论区或者私信我,感谢大家的支持

💻那么,快拿出你的电脑,跟着文章一起学习起来吧


一、分区表

1.非分区表

👉:传送门💖非分区表构💖


2.分区表

2.1 概念

👉:传送门💖概念💖


2.2 MySQL数据库表分区

2.2.1 InnoDB 逻辑存储结构

👉:传送门💖InnoDB 逻辑存储结构💖


2.2.2 段(segment)

2.2.3 区(extent)

2.2.4 页(page)


2.3 MySQL数据库分区的由来

👉:传送门💖MySQL数据库分区的由来💖


2.4 为什么对表进行分区?

👉:传送门💖为什么对表进行分区💖


2.4.1 表分区要解决的问题

2.4.2 表分区有如下优点


2.5 MySQL的分区形式

👉:传送门💖MySQL的分区形式💖


2.5.1 水平分区(HorizontalPartitioning)

2.5.2 垂直分区(VerticalPartitioning)


2.6 MySQL分区的类型

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 MySQL分区代码

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 常见分区操作

👉:传送门💖常见分区操作💖


2.8.1 删除分区

2.8.2 增加分区

2.8.3 分解分区

2.8.4 合并分区

2.8.5 重新定义分区

2.8.6 重建分区

2.8.7 检查分区

2.8.8 修补分区


2.9 MySQL分区表的局限性

👉:传送门💖MySQL分区表的局限性💖


2.9.1 错误示例

2.9.2 错误修正


2.10 MySQL分区处理null值的方式

如果分区键所在列没有not null约束

如果是range分区表,那么null行将被保存在范围最小的分区。

如果是list分区表,那么null行将被保存到1ist为0的分区。

在按HASH和KEY分区的情况下,任何产生NULL值的表达式mysql都视同它的返回值为0.

为了避免上述这种情况的产生,建议分区键设置成NOT MULL。


分区键必须是INT类型,或者通过表达式返回INT类型,可以为NULL

唯一的例外是当分区类型为KEY分区的时候,可以使用其他类型的列作为分区键(BLOB or TEXT列除外)

对分区表的分区键创建索引,那么这个索引也将被分区,分区键没有全局索引一说

只有RANGE和LIST分区能进行子分区,HASH和KEY分区不能进行子分区。

临时表不能被分区

2.11 获取分区表信息的方法

2.11.1 查看创建分区表的create语句

## show create table 表名
show create table foo_list


2.11.2 查看表是否是分区表

show table status like 'foo_range'


2.11.3 查看information_schema.partition表

该表提供分区表相关的信息,每一行都关联一个独立的分区或者子分区

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 : 注释信息


2.11.4 查看表具有哪几个分区,分区的方法,分区中数据的记录数等信息

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'


2.11.5 显示扫描哪些分区及它们是如何使用的

explain partitions select语句


3.性能对比(分区表和非分区表)

3.1步骤1:创建两张表 part_tab(分区表),no_part_tab(普通表)

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
)


3.2 步骤2:存储过程

3.2.1 创建存储过程

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;


3.2.2 调用存储过程,插入数据

call load_part_tab();


3.2.3 导数据

从part_tab 导入数据到 no_part_tab

insert into no_part_tab select * from part_tab


3.3 步骤3: 进行对比

3.3.1 执行查询速度对比

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';

3.3.2 扫描次数对比

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';

4. 分区使用场景

当数据量很大(过T)时,肯定不能把数据再如到内存中,这样查询一个或一定范围的item是很耗时。另外一般这情况下,历史数据或不常访问的数据占很大部分,最新或热点数据占的比例不是很大。这时可以根据有些条件进行表分区。

分区表的更易管理,比如删除过去某一时间的历史数据,直接执行truncate,或者狠点drop整个分区,这比detele删除效率更高

当数据量很大,或者将来很大的,但单块磁盘的容量不够,或者想提升I0效率的时候,可以把没分区中的子分区挂载到不同的磁盘上。

使用分区表可避免某些特殊的瓶颈,例如Innodb的单个索引的互斥访问…

在某些场景下,单个分区表的备份很恢复会更有效率

总结: 可伸缩性,可管理性,提高数据库查询效率。


小结

🎉 🎉 🎉感谢大家耐心的看完这篇文章,对于SQL在表分区的知识点,我们在MySQL方面已经有五篇内容了,而我们对于MySQL的分区通过这五篇内容也终于可以✅告一段落了

如果大家觉着还算可以,那么就给个三连支持一下吧,如果想要继续关注和学习后续更多的内容,就关注一下👨爱书不爱输的程序猿吧,当然,如果大家还有什么其他方面的知识点想要看,可以在评论区或者私信我


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 数据采集 关系型数据库
实现MySQL与SQL Server之间数据迁移的有效方法
总的来说,从MySQL到SQL Server的数据迁移是一个涉及到很多步骤的过程,可能会遇到各种问题和挑战。但只要精心规划、仔细执行,这个任务是完全可以完成的。
118 18
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL】SQL分析的几种方法
以上就是SQL分析的几种方法。需要注意的是,这些方法并不是孤立的,而是相互关联的。在实际的SQL分析中,我们通常需要结合使用这些方法,才能找出最佳的优化策略。同时,SQL分析也需要对数据库管理系统,数据,业务需求有深入的理解,这需要时间和经验的积累。
103 12
|
3月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
3月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
22天前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
161 1
|
2月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
4月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
2月前
|
存储 关系型数据库 MySQL
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
本文详细介绍了在 MySQL 中创建数据库和表的方法。包括安装 MySQL、用命令行和图形化工具创建数据库、选择数据库、创建表(含数据类型介绍与选择建议、案例分析、最佳实践与注意事项)以及查看数据库和表的内容。文章专业、严谨且具可操作性,对数据管理有实际帮助。
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
|
2月前
|
SQL 关系型数据库 MySQL
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
这是一份详细的MySQL安装与配置教程,适合初学者快速上手。内容涵盖从下载到安装的每一步操作,包括选择版本、设置路径、配置端口及密码等。同时提供基础操作指南,如数据库管理、数据表增删改查、用户权限设置等。还介绍了备份恢复、图形化工具使用和性能优化技巧,帮助用户全面掌握MySQL的使用方法。附带常见问题解决方法,保姆级教学让你无忧入门!
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
|
4月前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
653 82

推荐镜像

更多