当前位置: 首页 > news >正文

分区表介绍

问题

单表数据量过大,查询的性能通常会变得很低

  • 查询时磁盘的IO次数增加:MySQL的InnoDB引擎使用B+树维护索引,一个典型的索引节点大概可以存储60-120个数据记录,一个三层的索引大概可以存储百万条数据。如果订单表增加一个数量级,索引的层数也需要增加,查询订单时磁盘的IO次数也随着增加,影响性能。
  • 索引占用存储空间:为了加快查询效率,订单表通常需要创建一些索引。但是,索引也需要占用一定的存储空间,并且会增加每次修改操作的时间成本。另外,当表中数据量过大时,更新操作可能会导致索引重新排序的问题,这些都将极大地降低索引效率和查询效率。

分区表

将一个逻辑表分解成多个分区表,以存储和管理物理数据的技术。每个分区实际上是一个独立的表,包含了与主表相同的列,并有一个特定的分区键,用于确定每行数据所属的分区。

好处:

  • 提高查询效率:分区表将数据拆分为多个分区,减少表了的扫描范围,减少了磁盘IO次数,从而提高查询效率。
  • 提高数据可用性:数据分布在多个节点,降低数据丢失的风险。如果系统上的一个节点失败,可以通过分区表快速将数据迁移到其他节点上。从而提升可用性。
  • 减少维护成本:使用分区表可以提高维护的效率,在维护分区表时,只需要维护每个分区而不是整个表,可以减少人力成本和维护时间。
  • 支持大型数据集:使用分区表可以在快速的响应时间内管理海量的数据,增加表的数量不会影响系统性能。

类型:Range分区、Hash分区、List分区和Key分区。

  • RANGE分区:基于给定的有序区间将表中数据分成若干段,每一段称为一个分区。RANGE分区表可以使用任何能够进行比较大小的数据类型,如整数、日期等。适用于记录按区百分比分布更均匀的数据表regions这类数据。
  • HASH分区:根据哈希函数将行数据分配到分区中。此方法适用于任何数据类型,并且具有随机性。此类型的分区通常用于随机分布的数据,如日志数据。
  • LIST分区:List分区使用一个列表定义分区,每个分区包含了特定的值集合。如果记录的值包含在列表中,那么记录将存储在相应的分区中。
  • KEY分区:类似于哈希分区,但不是基于哈希函数,而是根据列值上的一组键来执行分区。它只能用于 BLOB、TEXT、VARCHAR 或其他支持索引的数据类型。

工作原理

  • 创建分区表:指定分区键,即表上哪一列的值作为分区依据。选择不同的分区类型将影响到后面的分区操作和存储方式。
-- 根据订单下单时间的年份,将数据分别划分到三个分区中,分别是p_2021、p_2022和p_2023
CREATE TABLE `orders` (`order_id` int unsigned NOT NULL,`user_id` int unsigned NOT NULL,`product_id` int unsigned NOT NULL,`order_time` datetime NOT NULL,PRIMARY KEY (`order_id`,`order_time`) //分区字段必须包含在主键字段
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (year(`order_time`))
(PARTITION p_2021 VALUES LESS THAN (2022) ENGINE = InnoDB,PARTITION p_2022 VALUES LESS THAN (2023) ENGINE = InnoDB,PARTITION p_2023 VALUES LESS THAN (2024) ENGINE = InnoDB) */;
  • 插入数据:INSERT INTO orders (order_id, user_id, product_id, order_time) VALUES (1, 1001, 2001, ‘2023-06-01 10:00:00’);

  • 查询数据:在查询分区表时,MySQL会根据查询条件中的分区键值范围定位到对应的分区,然后只扫描该分区中的数据,避免无关分区数据的扫描访问,大幅降低查询数据开销。

  • 新建分区:ALTER TABLE orders ADD PARTITION (PARTITION p_2024 VALUES LESS THAN (2025));

  • 普通表转分区表:

    • 创建一个与原表结构完全相同的分区表,但不包含分区定义

      CREATE TABLE my_partitioned_table (-- 复制原表的所有列和约束...
      ) PARTITION BY ...; -- 分区定义留空
      
    • 将原表的数据插入到分区表中。可以使用 INSERT INTO ... SELECT 语句将数据复制到分区表中。

    • 停止对原表的写入操作,并记录最后一次写入的时间点(例如通过添加一个新列来记录)。

    • 重命名原表,并将分区表重命名为原表的名称。

    • 根据转换前的原表的写入时间点,更新分区表的分区定义。ALTER TABLE my_table REORGANIZE PARTITION …;

      • REORGANIZE PARTITION 语句,重新定义分区范围,并将数据移动到相应的分区中。
    • 可以根据需要重新建立索引、重新生成统计信息等操作。

  • 各分区count合计:

    SELECT SUM(PARTITION_ROWS) -- TABLE_ROWS
    FROM INFORMATION_SCHEMA.PARTITIONS 
    WHERE TABLE_NAME = 'your_partitioned_table';AND PARTITION_NAME IS NULL;
    
  • 分区剪枝

    • MySQL 的优化器在执行查询时自动进行的一种技术,用于排除不相关的分区,以减少扫描的数据量

    • SELECT SUM(amount)
      FROM sales
      WHERE date BETWEEN '2021-01-01' AND '2022-12-31';
      
    • 在执行上述查询时,MySQL 的优化器会自动应用分区剪枝技术,只选择与查询条件相关的分区进行扫描。优化器会识别出只有 p2021p2022 这两个分区包含所需的数据,其他分区则可以被排除在外。

    • 通过分区剪枝,优化器会生成一个优化的执行计划,只对涉及的分区进行扫描,从而减少了查询的数据量和处理的开销,提高了查询的性能。

    • 注意,在使用分区剪枝时,查询条件必须与分区键相关才能生效。如果查询条件不与分区键相关,优化器将无法剪枝分区,会扫描所有的分区。

    • 分区剪枝是 MySQL 的一种自动优化技术,通过排除不相关的分区来减少查询的数据量,从而提高查询性能。它在处理大型分区表和时间范围查询时特别有用。

  • 维护数据:在维护分区表时,MySQL会自动锁定需要维护的分区,而不是整张表的数据,以保证维护的效率。同时,也可以单独清空或重建某个分区,批量操作数据时可以显著提升效率。

  • 优化查询:特定查询场景下,分区表拆分可以显著提高查询效率,如特定的日期范围查询、根据某个分区键值排序、查找特定某个分区,均可借助MySQL分区表的方式优化查询效率。

设计分区表:

  • 选择合适的分区键:分区键决定了分区表行如何分布到分区内,以及如何检索和更新数据。常见的分区键有日期、地理位置、ID等。具体选择应根据业务逻辑来确定,例如订单表可以在日期上进行分区,地理信息表可以在地理位置上进行分区。
  • 考虑分区的大小和数量:每个分区的大小和数量应该根据数据大小和查询模式来考虑。如果数据量超过单个分区的容量,则无法放在同一分区里,需要更多的分区来存储。同时,分区的数量也会影响查询速度,过多的分区会降低查询效率。
  • 确定分区键的最大值:分区键的最大值决定了数据的分区数量和数据的存储位置。如果数据量是无限的,则需要特别注意分区最大值的范围。如果最大值太小,则需要及时分区,否则跨越分区将不得不扫描整个表,会影响查询性能。
  • 对不同的分区类型进行评估:MySQL支持多种分区类型,包括Range、List、Hash、Key等。不同的分区类型可以根据分区键的类型和数量来选择,以最大化查询性能和管理效率。

分区表维护:

  • 检查分区表:当MySQL分区表发生异常时,需要检查分区表是否存在错误、分区的状态是否正常。MySQL提供了一些命令和函数供检查分区表,如SHOW CREATE TABLE显示表的创建语句,检查分区键是否合法,SHOW TABLE STATUS查看分区表的统计信息,若有异常则使用ALTER TABLE修复、检查或重建分区等。
  • 修改分区表:修改分区表有添加、删除和合并分区等操作,可以使用ALTER TABLE语法实现。
    • 添加分区:ADD PARTITION,删除分区:DROP PARTITION,合并分区:COALESCE PARTITION。
    • 注意:修改分区表可能会影响分区表上的数据,因此在执行分区操作前一定要先进行备份和归档操作。
  • 备份和恢复:对MySQL的分区表进行备份的方式与常规的备份方法不同,需要通过备份分区数据进行。备份可以使用如mysqldump, mk-parallel-restore等工具,或者手动复制每个分区的数据文件。当需要恢复分区表时,需要先还原分区表的数据,然后使用ALTER TABLE语法添加或恢复分区。维护MySQL分区表的关键是要及时备份并定期检查表、分区状态。定期备份可以使用MySQL的工具或第三方工具,检查分区状态可以手动或使用MySQL的工具来执行。通过备份分区数据来保证数据重要性,通过检查分区表来发现异常并及时修复和调整,在数据维护和管理上,能够更加有管理可控性。
  • 分区表的局限性:分区表虽然能够大幅提高查询性能和方便维护数据,但在一些特定的情况下,分区表也存在一些限制和局限性:
    • 对于一些不包括分区键的查询,扫描整张表数据会影响查询性能。
    • 分区表无法有效应对数据分布不均的情况,容易造成些分区数据过大而导致性能下降。
    • 分区表的建立需要仔细考虑分区键的选择和范围,如果分区键的范围选择不当,会导致数据跨分区查询或更新,影响性能和数据正确性。

https://mp.weixin.qq.com/s/IPcQNnbNi87xtP9HR0nHAQ

https://blog.csdn.net/shang_xs/article/details/131895007

相关文章:

分区表介绍

问题 单表数据量过大,查询的性能通常会变得很低 查询时磁盘的IO次数增加:MySQL的InnoDB引擎使用B树维护索引,一个典型的索引节点大概可以存储60-120个数据记录,一个三层的索引大概可以存储百万条数据。如果订单表增加一个数量级…...

emacs 源码分析(七)

文章目录 emacs源码分析&#xff08;七&#xff09;自己动手把emacs的DEFUN宏抠出来 <2024-01-07 周日> emacs源码分析&#xff08;七&#xff09; 这DEFUN宏就像胶水一样&#xff0c;它把c代码和emacs-lisp代码给联系起来。但是DEFUN宏看着怪恐怖的有没有&#xff01;…...

Linux运维-Web服务器的配置与管理(Apache+tomcat)(没成功,最后有失败经验)

Web服务器的配置与管理(Apachetomcat) 项目场景 公司业务经过长期发展&#xff0c;有了很大突破&#xff0c;已经实现盈利&#xff0c;现公司要求加强技术架构应用功能和安全性以及开始向企业应用、移动APP等领域延伸&#xff0c;此时原来开发web服务的php语言已经不适应新的…...

探讨分布式数据库ID生成解决方案

在技术面试中&#xff0c;面试官通常通过挑战应聘者的分布式系统知识来评估其能力。今天&#xff0c;让我们模拟一场面试现场&#xff0c;深入了解关于分布式数据库ID生成的解决方案。 面试官&#xff1a;嘿&#xff0c;小伙子&#xff0c;分布式数据库ID生成解决方案了解吗&a…...

Clickhouse填坑记4:Too many parts问题分析

Clickhouse在进行大数据量同步时,感觉很爽,插入速度非常快,但是,在使用过程中却出现了几次“Too many parts”异常报错,搞得很痛苦,这里记录一下解决过程。 我这边采用的是Flink程序,实时将数据写入ClickHouse,在执行一段时间后,会提示“Too many parts”异常,如下异…...

CertiK CSO Dr. Kang Li 确认出席Hack .Summit() 香港区块链盛会

CertiK CSO Dr. Kang Li 确认将出席由 Hack VC 主办&#xff0c;并由 AltLayer 和 Berachain 联合主办&#xff0c;与 SNZ 和数码港合作&#xff0c;由 Techub News 承办的Hack.Summit() 2024区块链开发者盛会。 Dr. Kang Li 目前担任CertiK首席安全官。他是清华蓝莲花战队启蒙…...

C++ 游戏飞机大战, 字符型的

//#define _CRT_SECURE_NO_WARNINGS 1 用于禁止不安全函数的警告 #include<iostream> #include<stdlib.h> #include<string> #include<conio.h> #include<Windows.h> #include<time.h> #include <graphics.h> using namespace std;…...

用html编写的简易新闻页面

用html编写的简易新闻页面 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...

docker-mysql:5.7安装

1、下载mysql:5.7镜像 [rootlocalhost ~]# docker search mysql (某个XXX镜像名字) [rootlocalhost ~]# docker pull mysql:5.7 按装之前查看一下是否按装过mysql。如果安装过会占用3306端口。 [rootlocalhost ~]# ps -ef | grep mysql 2、简单的安装 [rootlocalhost ~]# d…...

SQLPro Studio:数据库管理的革命性工具 mac版

SQLPro Studio是一款强大的数据库管理和开发工具&#xff0c;它旨在提供高效、便捷和安全的数据库操作体验。无论是数据库管理员、开发人员还是数据分析师&#xff0c;SQLPro Studio都能满足他们在数据库管理、查询、设计和维护方面的需求。 SQLPro Studio mac版软件获取 首先…...

【小沐学QT】QT学习之OpenGL开发笔记

文章目录 1、简介2、Qt QOpenGLWidget gl函数3、Qt QOpenGLWidget qt函数4、Qt QOpenGLWindow5、Qt glut6、Qt glfw结语 1、简介 Qt提供了与OpenGL实现集成的支持&#xff0c;使开发人员有机会在更传统的用户界面的同时显示硬件加速的3D图形。 Qt有两种主要的UI开发方…...

kali安装ARL灯塔(docker)

1、root身份进入容器 ┌──(root㉿Kali)-[~/桌面] └─# su root ┌──(root㉿Kali)-[~/桌面] └─# docker 2、先更新再克隆 ┌──(root㉿Kali)-[~/桌面] └─# apt-get update …...

字节面试分享,请详细介绍为何Http Post发送两次请求

在浏览器中&#xff0c;内容是很开放的&#xff0c;任何资源都可以接入其中&#xff0c;如 JavaScript 文件、图片、音频、视频等资源&#xff0c;甚至可以下载其他站点的可执行文件。 但也不是说浏览器就是完全自由的&#xff0c;如果不加以控制&#xff0c;就会出现一些不可…...

Flink CDC 3.0 Starrocks建表失败会导致任务卡主!

Flink CDC 3.0 Starrocks建表失败会导致任务卡主&#xff01; 现象 StarRocks建表失败&#xff0c;然后任务自动重启&#xff0c;重启完毕后数据回放&#xff0c;jobMaster打印下面日志后&#xff0c;整个任务会卡主 There are already processing requests. Wait for proce…...

基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面

目录 简介注册与软件获取工程配置设计 UI导出源码板级验证更多内容 简介 SquareLine Studio 是一款专业的 UI 设计软件&#xff0c;它与 LVGL&#xff08;Light and Versatile Graphics Library&#xff0c;轻量级通用图形库&#xff09;紧密集成。LVGL 是一个轻量化的、开源的…...

Selenium IDE插件录制网页,解放双手

1、 国内下载地址 https://www.crx4chrome.com/crx/77585/ &#xff0c;这个网络正常基本可以下载&#xff0c;目前最新版本是3.17.2。 点击Crx4Chrome下载。下载后的文件名称是&#xff1a;mooikfkahbdckldjjndioackbalphokd-3.17.2-Crx4Chrome.com.crx。 2、 安装 直接打开…...

【LeetCode】【滑动窗口长度不固定】978 最长湍流子数组

1794.【软件认证】最长的指定瑕疵度的元音子串 这个例题&#xff0c;是滑动窗口中长度不定求最大的题目&#xff0c;在看题之前可以先看一下【leetcode每日一题】【滑动窗口长度不固定】案例。 题目描述 定义&#xff1a;开头和结尾都是元音字母&#xff08;aeiouAEIOU&…...

水库安全监测方案(福建地区水库安全监测案例分享)

我司星创易联最近在福建省受到了一个水库安全监测系统项目的委托。该水库位于福建中部山区,作为该地区的重要防洪与供水工程,对下游数十万人的生活产生重大影响。但是因为水库附近地质情况复杂,水库大坝在多次洪水冲击下出现一定病害,亟须全面加强对水库大坝安全状况的监测,以确…...

Oracle内存计算应用模式

前言 内存计算是利用内存来加速数据访问和应用的性能&#xff0c;并降低应用开发复杂度的技术。近十年来&#xff0c;随着软硬件技术的发展和用户需求的成熟&#xff0c;内存计算技术已经得到了广泛地应用。 Oracle在内存计算领域具有非常重要的地位&#xff0c;这主要得益于…...

ELK日志系统

一、规划 服务名所在服务器kafka1—2.13-2.4.1192.168.76.10kafka2—2.13-2.4.1192.168.76.11kafka3—2.13-2.4.1192.168.76.12zookeeper1—3.6.3192.168.76.10zookeeper2—3.6.3192.168.76.11zookeeper3—3.6.3192.168.76.12elasticsearch1—7.12.1192.168.76.10elasticsearc…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...