iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql临时表及分区表区别详解
  • 687
分享到

Mysql临时表及分区表区别详解

Mysql临时表分区表 2022-05-26 16:05:05 687人浏览 八月长安
摘要

临时表与内存表 内存表,指的是使用Memory引擎的表,建表语法是create table … engine=memory。这种 表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。除

临时表与内存表

内存表,指的是使用Memory引擎的表,建表语法是create table … engine=memory。这种 表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。除了这两个特性看 上去比较“奇怪”外,从其他的特征上看,它就是一个正常的表

临时表,可以使用各种引擎类型 。如果是使用InnoDB引擎或者MyISAM引擎的临时表,写 数据的时候是写到磁盘上的。当然,临时表也可以使用Memory引擎。

临时表特性

  • 建表语法是create temporary table …。
  • 一个临时表只能被创建它的session访问,对其他线程不可见。所以,图中session A创建的 临时表t,对于session B就是不可见的。
  • 临时表可以与普通表同名。
  • session A内有同名的临时表和普通表的时候,show create语句,以及增删改查语句访问的是临时表。
  • show tables命令不显示临时表。

由于临时表只能被创建它的session访问,所以在这个session结束的时候,会自动删除临时表。 也正是由于这个特性,临时表就特别适合join优化这种场景。

create temporary table temp_t like t1;
alter table temp_t add index(b);
insert into temp_t select * from t2 where b>=1 and b<=2000;
select * from t1 join temp_t on (t1.b=temp_t.b);

不同session的临时表是可以重名的,如果有多个session同时执行join优化,不需要担心表名重复导致建表失败的问题。不需要担心数据删除问题。如果使用普通表,在流程执行过程中客户端发生了异常断开,或者数据库发生异常重启,还需要专门来清理中间过程中生成的数据表。而临时表由于会自动回收,所以不需要这个额外的操作。临时表的应用

分库分表系统的跨库查询

一般分库分表的场景,就是要把一个逻辑上的大表分散到不同的数据库实例上。比如。将一个大 表ht,按照字段f,拆分成1024个分表,然后分布到32个数据库实例上。

分区key的选择是以“减少跨库和跨表查询”为依据的。如果大部分的语句都会包 含f的等值条件,那么就要用f做分区键。这样,在proxy这一层解析完sql语句以后,就能确定将这条语句路由到哪个分表做查询。 比如

select v from ht where f=N;

这时,我们就可以通过分表规则(比如,N%1024)来确认需要的数据被放在了哪个分表上。这种语句只需要访问一个分表,是分库分表方案最欢迎的语句形式了。

但是,如果这个表上还有另外一个索引k,并且查询语句是这样的:

select v from ht where k >= M order by t_modified desc limit 100;

这时候,由于查询条件里面没有用到分区字段f,只能到所有的分区中去查找满足条件的所有 行,然后统一做order by 的操作。这种情况下,有两种比较常用的思路:

在proxy层的进程代码中实现排序,对proxy端的压力比较大,尤其是很容易出现内存不够用和CPU瓶颈的问题。

把各个分库拿到的数据,汇总到一个Mysql实例的一个表中,然后在这个汇总实例上做逻辑操作。

在汇总库上创建一个临时表temp_ht,表里包含三个字段v、k、t_modifified;

在各个分库上执行

select v,k,t_modified from ht_x where k >= M order by t_modified desc limit 100;

把分库执行的结果插入到temp_ht表中;

执行

select v from temp_ht order by t_modified desc limit 100;

为什么临时表可以重名

create temporary table temp_t(id int primary key)engine=innodb;

执行这个语句的时候,mysql要给这个InnoDB表创建一个frm文件保存表结构定义,还要有地方保存表数据。

这个frm文件放在临时文件目录下,文件名的后缀是.frm,前缀是“#sql{进程id}_{线程id}_序列 号”。你可以使用select @@tmpdir命令,来显示实例的临时文件目录。

这个进程的进程号是1234,session A的线程id是4,session B的线程id是5。所以session A和session B创建的临时表,在磁盘上的文件不会重名

MySQL维护数据表,除了物理上要有文件外,内存里面也有一套机制区别不同的表,每个表都对应一个table_def_key。 对于临时表,table_def_key在“库名+表名”基础上,又加入了“server_id+thread_id”。

也就是说,session A和sessionB创建的两个临时表t1,它们的table_def_key不同,磁盘文件名 也不同,因此可以并存。

分区表的引擎层行为


ATE	TABLE	`t`	(
		`ftime`	datetime	NOT	NULL,
		`c`	int(11)	DEFAULT	NULL,
		KEY	(`ftime`)
)	ENGINE=InnoDB	DEFAULT	CHARSET=latin1
PARTITION	BY	RANGE	(YEAR(ftime))
Û ॔ګդᎱ
B
 (PARTITION	p_2017	VALUES	LESS	THAN	(2017)	ENGINE	=	InnoDB,
 	PARTITION	p_2018	VALUES	LESS	THAN	(2018)	ENGINE	=	InnoDB,
 	PARTITION	p_2019	VALUES	LESS	THAN	(2019)	ENGINE	=	InnoDB,
 PARTITION	p_others	VALUES	LESS	THAN	MAXVALUE	ENGINE	=	InnoDB);
 insert	into	t	values('2017-4-1',1),('2018-4-1',1);

初始化表的时候,只插入了两行数据,sessionA的select语句对ftime这两个记录之间的间隙加了,间隙和加锁状态如图:

也就是说,2017-4-1和2018-4-1这两个记录之间的间隙会被锁住,那么sessionB的两条插入语句都应该进入锁等待状态。但是从效果上看,第一个insert语句是可以执行成功的,因为对于引擎来说,p2018和p2019是不同的表,2017的下一个记录不是2018-4-1而是p2018中的supremum,所以在t1时刻索引如图:

由于分区表的规则,sessionA只操作了p2018,sessionB要插入2018-2-1是可以的但要写入2017-12-1要等待sessionA的间隙锁。

对于MYISAM引擎:

因为在sessionA中,sleep了100秒,由于myisam只支持表锁,所以这条update会锁住整个表t的读,但是结果是,B的第一条语句是可以执行的,第二条语句才进入锁等待状态。

这是myisam表锁只在引擎层实现的,sessionA加的表锁,是所在p2018上,因此只会堵住分区上执行的查询,落到其他分区的查询不受影响。这样看来,分区表还不错,为什么不用呢,我们使用分区表的一个原因就是单表过大,那么不使用分区表,就要使用手动分表的方式。

手动分表需要创建t_2017,t_2018,t_2019,也就是找到需要更新的所有分表,依次执行,这和分区表无实质的差别,两者一个由serverceng决定使用哪个分区,一个由应用层代码决定使用哪个分表,因此,从引擎层看无实际差别。其实主要区别是在server层:打开表行为。

分区策略

每当第一次访问一个分区表时,mysql需要把所有分区都访问一遍:如果分区很多,比如查过了1000个,mysql启动的时候,open_files_limit默认为1024,那么就会在访问表的时候,由于打开了所有文件,超过了上限而报错。

mysiam使用的分区策略成为通用分区策略,每次访问分区都是有server层控制。有比较严重的性能问题。

innodb引擎引入了本地分区策略,是在innodb内部自己管理打开分区的行为。

分区表的server层行为

从server层看,一个分区表就是一个表。

虽然B只操作2017分区,但是由于A持有整个表t的mdl锁,导致了B的alter语句被堵住。如果是使用普通分表,不会跟另外一个分表上的查询语句出现MDL冲突。

小结:

  • mysql在第一次打开分区表的时候,需要访问所有分区
  • 在server层,认为这是同一张表,因此所有分区公用MDL锁
  • 在引擎层,认为这是不同的表,因此在MDL锁之后,会根据分区表规则,只访问必要的分区。

分区表应用场景

分区表的优势是对业务透明,相对于用户分表来说,使用分区表的业务代码更简洁,分区表可以很方便的清理历史数据。

alter table t drop partition 操作是删除分区文件,效果跟drop类似,与delete相比,优势是速度快,对系统影响小。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。

您可能感兴趣的文档:

--结束END--

本文标题: Mysql临时表及分区表区别详解

本文链接: https://www.lsjlt.com/news/9819.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中的分区表和临时表是什么
    这篇文章主要为大家展示了“MySQL中的分区表和临时表是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中的分区表和临时表是什么”这篇文章吧。临时表...
    99+
    2024-04-02
  • MySQL中Update、select联用操作单表、多表,及视图与临时表的区别
    一、MySQL中使用从表A中取出数据来更新表B的内容 例如:要update表data中的一些列属性,但是修改属性的内容来源是来自表chanpin。SQL语言中不要显示的出现select关键字 updat...
    99+
    2024-04-02
  • SQLSERVER临时表和表变量的区别汇总
    目录一:背景1. 讲故事二:到底有什么区别1. 前置思考2. 如何验证都存储在 tempdb 中 3. 不同点在哪里三:总结一:背景 1. 讲故事 今天和大家聊一套面试中经常被问到的...
    99+
    2023-02-16
    SQLSERVER 临时表和表变量区别 SQLSERVER 临时表 SQLSERVER 表变量
  • SQLSERVER 临时表和表变量的区别汇总
    目录一:背景1. 讲故事二:到底有什么区别1. 前置思考2. 如何验证都存储在 tempdb 中 3. 不同点在哪里三:总结一:背景 1. 讲故事 今天和大家聊一套面试中经常被问到的高频题,对,就是 临时表 和 表变量 ...
    99+
    2023-02-16
    SQLSERVER临时表和表变量区别 SQLSERVER临时表 SQLSERVER表变量
  • SQL Server 表变量和临时表的区别是什么
    SQL Server 表变量和临时表的区别是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、表变量  表变量在SQL S...
    99+
    2024-04-02
  • MySQL分区表和分桶表的操作详解
    目录1.创建分区表2.增删改查操作2.1 插入数据2.2 操作数据3. 二级分区表3.1 创建分区表3.2 插入数据4.动态分区5.分桶表5.1 新建分桶表5.2 插入数据5.3 既分区有分桶6 分区与分桶的区别1.创建...
    99+
    2023-05-12
    MySQL分区表和分桶表 MySQL分区表 MySQL分桶表
  • Oracle表分区详解
    目录一、 表空间及分区表的概念表空间:分区表:二、表分区的具体作用什么时候使用分区表:三、表分区的优缺点优点:缺点:四、表分区的几种类型及操作方法1、范围分区:2、列表分区:3、散列...
    99+
    2024-04-02
  • mysql中分表与分区的区别是什么
    这篇文章将为大家详细讲解有关mysql中分表与分区的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一,什么是mysql分表,分区什么是分表,从表面...
    99+
    2024-04-02
  • MySQL分区表的分区原理及优缺点
    这篇文章主要介绍“MySQL分区表的分区原理及优缺点”,在日常操作中,相信很多人在MySQL分区表的分区原理及优缺点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL分...
    99+
    2024-04-02
  • mysql分区表:日期分区
    mysql分区表:日期分区 1.创建分区表2.查看分区3.添加分区4.存储过程:分区删除与创建5.事件定时6.触发器设计:子表每插入一行,总表获得一行7.创建索引8.添加枚举型字段 1.创建分区表 CREATE TAB...
    99+
    2023-08-21
    mysql 数据库
  • hive分区表和分桶表有什么区别
    Hive分区表和分桶表是两种数据存储和管理的方式,有以下区别: 分区表:在Hive中,分区表是按照指定的列值进行分区存储数据的表...
    99+
    2024-03-01
    hive
  • Python 列表与链表的区别详解
    目录python 列表和链表的区别列表的实现机制链表链表与列表的差异python 列表和链表的区别 python 中的 list 并不是我们传统意义上的列表,传统列表——通常也叫作链...
    99+
    2024-04-02
  • mysql创建表分区详细介绍及示例
    mysql创建表分区详细介绍及示例 1. 基本概念1.1 什么是表分区?1.2 表分区与分表的区别1.3 表分区有什么好处?1.4 分区表的限制因素 2. 如何判断当前MySQL是否支持分区?3.分区类型详解3.1 MySQL支...
    99+
    2023-08-17
    mysql 数据库 java
  • MySQL 分区表设计
    MySQL 分区表设计 1、分区表设计方案 当设计 MySQL 分区表时,需要考虑以下几个方面:分区策略、分区字段、分区数量和分区函数。下面是一个详细的示例,展示了如何设计和执行分区表的增删改查操...
    99+
    2023-10-05
    mysql 数据库 分区表 sql
  • Mysql临时表原理及创建方法解析
    这篇文章主要介绍了Mysql临时表原理及创建方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 mysql 利用 temporary 关键字就可以创建...
    99+
    2024-04-02
  • mysql分区表笔记
    mysql分区表    mysql分区表是一个独立的逻辑表,但是底层由多个物理字表组成。    对分区的请求,都会通过句柄对象转化成对存储引擎接口的调用。所以分区对于...
    99+
    2024-04-02
  • hive内部表和外部表的区别详解
    Hive内部表:默认创建的表是内部表。hive完全管理表(元数据和数据)的声明周期,类似于RDBMS的表。当删除表时,他会删除源数据以及表的元数据。 Hive外部表:外部表的数据不是Hive拥有或者管理的,只管理元数据的...
    99+
    2023-04-26
    hive内部表和外部表区别 hive内部表 hive外部表
  • mysql表分区技术详细介绍
    1、概述     数据库单表到达一定量后,性能会有衰减,像mysql\sql server等犹为明显,所以需要把这些数据进行分区处理。同时有时候可能出现数据剥离什么的,分区...
    99+
    2024-04-02
  • MySql分表、分库、分片和分区知识深入详解
    一、前言 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈。需要进行数据的处理,采用的手段是分区、分片、分库、分表。 二、分片(类似分库) 分片是把数据库横向扩展(Scal...
    99+
    2024-04-02
  • mysql 5.6分区表应用
    mysql 5.6分区表测试:DROP TABLE IF EXISTS `my_orders`;CREATE TABLE `my_orders` (  `id` int(10) unsig...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作