MySQL进阶实战8,分区表详解

news2025/1/10 2:34:13

目录

    • 一、分区表
    • 二、分区的作用
    • 三、分区的一些限制
    • 四、分区表的增删改查
      • 1、select
      • 2、insert
      • 3、delete
      • 4、update
    • 五、分区表的类型
    • 六、如何使用分区表
    • 七、分区表会有哪些问题?
      • 1、分区列和索引列不匹配
      • 2、选择分区的成本可能很高
      • 3、打开并锁住所有底层表的成本可能会很高
    • 八、查询优化
      • MySQL进阶实战系列文章
      • 哪吒精品系列文章

一、分区表

分区表是一个独立的逻辑表,底层是由多个物理子表组成。实现分区的代码实际上是对一组底层表的句柄对象的封装。对分区表的请求,都会通过句柄对象转化成对存储引擎的接口调用。每一个分区表都有一个使用#分隔命名的表文件。

MySQL在创建表时使用PARTITION BY子句定义每个分区存放的数据。在执行查询的时候,优化器会根据分区定义过滤那些我们不需要的数据分区,这样就无须查询所有分区,只需要查找包含需要数据的分区就可以了。

分区的一个主要目的是将数据按照一个较粗的粒度分在不同的表中,这样做就可以将相关的数据存放在一起,另外,如果想一次性删除整个分区的数据也会变得更加简单。

二、分区的作用

  1. 表非常大以至于无法全部放在内存中,或者在表中存在热点数据,也有历史数据;
  2. 分区表的数据更容易维护,想批量删除大量数据时,可以使用清除整个分区的方式,还可以对一个独立的分区进行优化、检查、修复等操作;
  3. 分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备;
  4. 可以通过分区表来避免某些特殊的瓶颈,比如InnoDB单个索引的互斥访问;
  5. 可以备份和恢复独立的分区;

三、分区的一些限制

  1. 一个表最多只能有1024个分区;
  2. 某些场景中可以直接使用列进行分区;
  3. 分区表中无法使用外键约束;

四、分区表的增删改查

1、select

当查询一个分区表的时候,分区层先打开并锁住所有的底层表,优化器先判断是否可以过滤部分分区,然后再调用对应的存储引擎接口访问各个分区的数据。

2、insert

当写入一条数据时,分区层先打开并锁住所有的底层表,然后确定哪个分区接收这条记录,再将记录写入对应的底层表。

3、delete

当删除一条记录时,分区层先打开并锁住所有的底层表,然后确定数据对应的分区,最后对相应底层表进行删除操作。

4、update

当更新一条记录时,分区层先打开并锁住所有的底层表,先确定需要更新的记录在哪个分区,然后取出数据并进行更新,再判断更新后的数据应该放在哪个分区,最后对底层表进行写入操作,并对原数据所在的底层表进行删除操作。

虽然每个操作都会“分区层先打开并锁住所有的底层表”,但并不是说分区表的处理过程中是锁住全表的。如果存储引擎能够自己实现行级锁,例如InnoDB,则会在分区层释放对应表锁。这个加锁和解锁过程与普通InnoDB上的查询类似。

五、分区表的类型

MySQL支持多种分区表,分区表达式可以是列,也可以是包含列的表达式,根据时间分区尤为多见。

六、如何使用分区表

假设有一个数据量非常大的表,想从中查询出一段时间的记录,这个表中包含很多年的历史数据,数据是按时间排序的。

因为数据量巨大,肯定不能在每次查询的时候都扫描全表。首先考虑到要使用索引,但此时发现数据并不是按照想要的方式聚集的,而且有大量的碎片,最终会导致一个查询产生成千上万的随机I/O,应用程序随之卡死。

可以有两种方式,对其进行优化。

  1. 让所有的查询都只在数据表上做顺序扫描;
  2. 将数据表和索引全部缓存在内存里;

在数据量超大的时候,B-Tree索引就不好用了,除非是索引覆盖查询,否则数据库服务器需要根据索引扫描的结果回表,查询所有符合条件的记录,如果数据量巨大,还会产生大量随机I/O,查询时间漫长。此外,索引维护的代价也是非常高。此时,可以用分区表来解决,可以通过较小的代价,确定需要的数据在哪个分区表,在此分区表中做顺序扫描,可以建索引,还可以将数据缓存在内存中。

可以通过建立热点分区的方式解决,将热点数据放到一个分区中,让这个分区的数据能够有机会缓存在内存中,这样查询只访问一个很小的分区,能够使用索引,也能够使用缓存,速度快的多。

七、分区表会有哪些问题?

1、分区列和索引列不匹配

如果定义的分区列和索引列不匹配,会导致查询无法进行分区过滤。

假设在列id上定义了索引,在列create_time上进行了分区,因为每个分区都有其独立的索引,所以扫描列create_time上的索引就需要扫描每一个分区内对应的索引。如果每个分区内对应索引的非叶子节点都在内存中,那么扫描的速度还是可以接受的。

2、选择分区的成本可能很高

某一行属于哪个分区?这些符合条件的行在哪个分区?服务器需要扫描所有的分区来找到正确的分区,这样的线性查找的效率并不高,随着分区数的增长,成本会越来越高。

3、打开并锁住所有底层表的成本可能会很高

当查询访问分区表的时候,MySQL需要打开并锁住所有的底层表,这是分区表的一个很大的开销。这个操作在分区过滤之前,所以无法通过分区过滤降低此开销,并且此开销也和分区类型无关,会影响所有的查询。这一点对一些本身查询速度非常快的查询会带来明显的额外开销。可以通过批量操作的方式来降低单个操作的此类开销。

综上所述,分区会有很多隐患和问题。所以目前在进行分区的时候会加入一些限制。

  1. 所有分区都必须使用相同的存储引擎;
  2. 某些存储引擎不支持分区;
  3. 对于MyISAM的分区表,不能使用LOAD INDEX INTO CACHE

八、查询优化

分区最大的优点就是优化器可以根据分区函数来过滤一些分区,通过分区过滤通常可以让查询扫描更少的数据。



MySQL进阶实战系列文章

MySQL进阶实战1,数据类型与三范式

MySQL进阶实战2,那些年学过的事务

MySQL进阶实战3,mysql索引详解,上篇

MySQL进阶实战4,那些年学过的索引,下篇

MySQL进阶实战5,为什么查询速度会慢

MySQL进阶实战6,缓存表、视图、计数器表

MySQL进阶实战7,查询的执行过程

SQL性能优化的21个小技巧

mysql索引详解

MySql基础知识总结(SQL优化篇)

哪吒精品系列文章

Java学习路线总结,搬砖工逆袭Java架构师

10万字208道Java经典面试题总结(附答案)

Java基础教程系列

Spring Boot 进阶实战
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

统计信号处理基础 习题解答6-9

题目: 在开关键控(OOK)的通信系统中,我们发射两个信号中的一个,即 表示bit0,而 表示bit1。假定幅度是正的,为了确定发射的是哪个bit,我们对接收机的波形在符号周期内 进行采样&…

深入了解快速排序和归并排序

作者:~小明学编程 文章专栏:Java数据结构 格言:目之所及皆为回忆,心之所想皆为过往 快速排序和归并排序作为排序中的两个重点,也是面试中最常考的两个知识点,这里带大家详解的了解这两个排序。 目录 快速…

DSPE-PEG-TPP;磷脂-聚乙二醇-磷酸三苯酯;(阻燃剂TPP)是种含磷元素的化合物,可用作无卤环保型阻燃剂

中文名称: 二硬脂酰基磷脂酰乙醇胺-聚乙二醇-磷酸三苯酯;三苯基磷聚乙二醇磷脂 英文简称: DSPE-PEG-TPP,TPP-PEG-DSPE 分子量: 2000,3400,5000等 溶剂: 溶于部分有机溶剂 磷酸三苯酯为无味、无臭的白色结…

JDK8 连接Access数据库

JDK8 连接Access数据库1. 安装JDK82. 下载配置文件3. 源码设置前面我们讲了如何使用Java连接ODBC并配置Access数据库, 参考连接:https://jackwei.blog.csdn.net/article/details/86285822 可以知道JDK8之后已经不支持jdbc-odbc桥接了,如果你可…

windows10上运行magic keyboard和magic mouse

windows10上运行magic keyboard和magic mouse并保持你的mac习惯 所有需要的软件和插件都可以在这里寻找到链接:https://pan.baidu.com/s/1Y8vjRnznqKP7f8dFFrHoGw?pwdvpsy 提取码:vpsy 安装蓝牙 你的windows电脑可能自带了蓝牙,那你直接…

保姆级教程带你从0到1实现基于bitcask的kv存储引擎

愿景 ​ 今年大部分业余时间都在nutsdb的开源贡献上,nutsdb是基于bitcask模型实现的持久化存储引擎,提供了诸如list,set等多种丰富的数据结构。近来很多小伙伴,其中也有一些我的好朋友陆陆续续加入到这个项目上来。为了帮助小伙伴…

tensorflow2 SqueezeNet

前面学习了通过加深网络和加宽网络来改进模型质量,提高模型精度的深度学习backbone模型(LeNet,VGGNet,AlexNet,GoogleNet,ResNet),这里介绍如何使网络更快,结构更轻量化的改进深度神经网络模型之一————SqueezeNet,它能够在Ima…

【JavaWeb】文件的上传和下载

文章目录一.文件的上传介绍⭐️1.文件上传及HTTP协议的说明2.commons-fileupload.jar常用API介绍说明二.文件下载⭐️一.文件的上传介绍⭐️ 1.文件上传及HTTP协议的说明 (1).要有一个form标签,methodpost请求 (2).form标签的encType属性值必须为multipart/form-data值 (3).在…

VTK在Windows上的安装

本章介绍在计算机系统上安装VTK。在Microsoft Windows上,可以安装预编译的vtk.exe,也可以从源码自行编译vtk软件。您可能希望了解系统架构,阅读会使编译过程更容易跟踪。如果遇到问题,可以联系vtkusers邮件列表。 2.1 概述 VTK在…

【HTML + CSS】笔记

页面设计 1.HTML&#xff1a;结构框架 2.CSS 3.JS HTML&#xff1a;超文本标记语言 <...>&#xff1a;标签/元素 <!DOCTYPE html>&#xff1a;解释文档类型为html head区域常用标签 <base> 使用后浏览器不再使用当前文档的URL&#xff0c;而使用指定的…

web前端设计与开发期末作品/期末大作业-疫情

Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业&#xff0c;击疫情致敬逆行者感人类题材 | 致敬逆行者网页设计作品 | 大学生抗疫感动专题网页设计作业模板 | 等网站的设计与制作 | HTML期末大学生网页设计作业 HTML&#xff1a…

Windows之应用安装程序 —— winget

大家都用过Linux中的应用程序安装工具&#xff0c;如yum、apt、rpm等工具进行安装自己想要的一些工具或则软件之类的&#xff0c;当然Linux操作系统还是很强大的有很多类似的命令来安装我们所需要的程序&#xff0c;但是windwos有没有类似于windows这样的应用安装程序呢&#x…

可解释的AI:用LIME解释扑克游戏

可解释的AI&#xff08;XAI&#xff09;一直是人们研究的一个方向&#xff0c;在这篇文章中&#xff0c;我们将看到如何使用LIME来解释一个模型是如何学习扑克规则的。在这个过程中&#xff0c;我们将介绍: 如何将LIME应用到扑克游戏中;LIME如何工作;LIME 的优点和缺点是什么。…

免费查题系统搭建

免费查题系统搭建 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳…

STM32存储器组织-STM32存储器映像-嵌入式SRAM-STM32位段-嵌入式闪存-STM32启动配置

STM使用说明第二篇【1】STM32存储器组织【2】STM32存储器映像【3】嵌入式SRAM【4】STM32位段【5】嵌入式闪存【6】STM32启动配置【1】STM32存储器组织 程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。 数据字节以小端格式存放在存储器中。一…

【Java】IO流 - 节点流和处理流【Buffered】

文章目录节点流和处理流BufferedReaderBufferedWriterBufferd拷贝BufferedInputStream/BufferedOutputStream节点流和处理流 数据源就是存放数据的地方&#xff0c;可以是 文件、数组 等等&#xff1b; 节点流是比较底层的&#xff0c;直接操作二进制数据 包装流&#xff08;处…

石英砂过滤器 多介质过滤器 活性炭过滤器

石英砂过滤器简介 石英砂过滤器属于机械过滤器的一种为压力式过滤器&#xff0c;采用ABS蘑菇型水帽布水&#xff0c;内装若干种规格精制石英砂滤料&#xff0c;阻力小&#xff0c;通量大。利用过滤器内所装的填料来截留去除水中悬浮微粒和胶体杂质。当过滤器因滤层污脏&#x…

解决git配置多个SSH公钥的问题

项目场景&#xff1a; 之前跟同事共用一个项目私密仓库&#xff0c;现需拆分成两个仓库&#xff0c;结果同事提出他不想换&#xff0c;让我这边再创建一个新仓库。 那么接下来就遇到一个情况&#xff0c;原来仓库的公钥我并不想删除&#xff0c;还想继续使用&#xff0c…

Ubuntu20.04沉浸式装机

Ubuntu20.04沉浸式装机 文章目录Ubuntu20.04沉浸式装机前言1.装机之后系统更新&#xff0c;设置软件源2.安装系统驱动Notice3 安装CUDA及CuDNN4 常用软件安装4.1 常用软件安装4.2 Typora安装4.3 docker安装4.4 nvidia-docker 安装4.5 pypcd 安装4.6 PCL安装环境安装4.7 Eigen安…

Python学习基础笔记七——元组

元组tuple&#xff0c;跟列表相似&#xff0c;元组不能在原处修改。元组不支持任何方法调用&#xff0c;但是元组具有列表的大多数属性。 但是要记住的是&#xff1a;元组的不可变性只适用于元组本身&#xff0c;并非其内容。例如元组内部的列表是可以像往常一样修改的。 元组常…