MySQL 中的共享表空间与独立表空间,用哪个好呢?
作者 | 江南一点雨 责编 | 晋兆雨
1.独立表空间与共享表空间
2.该用哪一个?
2.1 独立表空间
2.2 共享表空间
3.迁移
好啦,那我们今天就开始学习 MySQL 中另外一个非常重要的存储引擎 InnoDB 了。
要说 InnoDB,我们就不得不先来说说另外一个比较重要的话题表空间和共享表空间,这也是我们本文的主题。
独立表空间与共享表空间
对于 InnoDB 存储引擎来说,它可以将每张表存放于独立的表空间,即tablename.ibd 文件;也可以将数据存放于 ibdata 的共享表空间,一般命名是 ibdataX,后面的 X 是一个具体的数字。
我们先来体验看看这两种有什么区别。
首先我们执行如下代码可以查看是否开启了独立表空间:
show variables like 'innodb_file_per_table';
可以看到,默认情况下,独立表空间是开启的。
这个时候我们来创建一个使用了 InnoDB 引擎的表,如下(默认存储引擎就是 InnoDB):
create table book(id int,name varchar(255));
创建完成后,我们来到存放数据文件的目录下,可以看到如下文件:
可以看到,当前表被存放在独立的 book.ibd 文件中。
存放于独立表空间的表都将会以独立文件的方式来进行存储,每一个表都有一个 .frm 表描述文件(这个和 MyISAM 引擎一致),还有一个.ibd 文件,这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
接下来我们执行如下代码,修改 innodb_file_per_table 的值为 OFF,即关闭独立表空间,如下:
关闭之后,再来创建新表:
create table book2(id int,name varchar(255));
新表创建成功之后,此时我们再去表目录下查看文件,发现并没有一个名为 book2.ibd 的文件,说明此时的表已经存放于共享表空间了。
那么共享表空间的 ibdata1 文件又在哪里呢?其实就在 MySQL 存放数据库的目录下:
我们可以通过如下命令查看 ibdata1的默认大小:
show variables like 'innodb_data_file_path';
可以看到,默认大小是 12M。
需要注意的是,innodb_file_per_table 要在创建表之前修改,创建表之后再去修改,是不会影响已有的表结构的。
该用哪一个?
要搞明白要用哪一种表空间,我们得先明白两种不同表空间各自的特点。
独立表空间
优势
每张表都有自己独立的表空间。
每张表的数据和索引都会存储在自己的表空间中。
可以实现单表在不同的数据库中移动(因为每张表都有独立的数据表文件)。
空间可以回收(通过 optimize table 命令实现)。
无论怎么删除,表空间的碎片不会太严重影响系统性能。
缺点
单表增加过大。
共享表空间
优势
可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同的文件上)。
数据和文件放在一起方便管理。
缺点
所有的数据和索引存放到一个文件中,这将意味着有一个很大的文件存在(虽然可以把一个大文件分成多个小文件),但是多个表及索引在表空间中混合存储,这样当一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析、日志系统这类应用而言,最不适合用共享表空间(例如,当系统空间不够用的时候,我们希望通过删除一些无效数据来腾出来一些表空间,这个时候我们会发现,如果使用了共享表空间,即使无效数据删除了,表空间还是还是不会缩小)。
共享表空间管理会出现表空间分配后不能回缩的问题,当临时建立索引或者临时表导致表空间扩大后,就是删除相关的表也没办法回缩那部分空间了。
对于第二点存在的问题,一般使用 mysqldump 导出数据,然后删除共享表空间数据文件后,再重新导入。
由于一个文件中保存了多个表数据,所以并发操作时可能会产生 IO 瓶颈,所以需要频繁写入的场景并不适合共享表空间。
经过以上的分析,相信小伙伴们已经明白了,在实际项目中,还是首选独立表空间比较好,事实上,从 MySQL5.6 开始,独立表空间就已经成为默认选项了。
迁移
最后还有一个问题,如果一开始创建的是共享表空间,那么还能迁移到独立表空间吗?当然可以!参考如下四个步骤:
使用 mysqldump 导出所有数据库表数据。
停止 MySQL 服务,修改 innodb_file_per_table参数,并删除 InnoDB 相关文件(如果是主从结构,则可以从 Slave 上入手完成这些操作)。
重启 MySQL 服务,重建 InnoDB 共享表空间(此时里边就没有数据了)。
重新导入数据。
好啦,今天就和小伙伴们聊一聊共享表空间和独立表空间,InnoDB 的其他玩法我们后面再继续介绍~
☞因融资失败,应用崩溃,3名程序员被“祭天”!☞iPhone 的续航有望加长!749 元的“磁吸充电宝”你会买吗?
☞iPhone 13或有日落金玫瑰金配色;传阿里巴巴和腾讯考虑互相开放生态系统;抖音内测“心动外卖”|极客头条
MySQL 中的共享表空间与独立表空间,用哪个好呢?相关推荐
- MySQL 中的共享表空间与独立表空间如何选择
对于 InnoDB 存储引擎来说,它可以将每张表存放于独立的表空间,即 tablename.ibd 文件;也可以将数据存放于 ibdata 的共享表空间,一般命名是 ibdataX,后面的 X 是一个 ...
- mysql 共享表空间、独立表空间
1. 简介 Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间(部分数据). 共享表空间以及独立表空间都是针对数据的存储 ...
- innodb 共享表空间 转 独立表空间 详细说明
关于 MySQL 中的 Innodb 引擎就不多说了, 毕竟除了MyISAM 之外, 它的应用最广泛. Innodb 存储数据有两种方式: 共享表空间 和 独立表空间. 顾名思义, 共享表空间 就是把 ...
- MySQL系统表空间和独立表空间
文章目录 第1章 基础环境和官方架构图 1.1 我的实践环境 1.2 官方的架构图 第2章 系/独表空间的基本认识一 2.1 系统表空间的认识 2.2 独立表空间的认识 第1章 基础环境和官方架构图 ...
- mysql的Innodb的系统表空间和独立表空间
mysql的Innodb的系统表空间和独立表空间 ============================================================= 主要区别 1:系统表空间无 ...
- 不同服务器数据库表连接查询修改,如何连接多个数据库,mysql中的服务器和查询两个表中的对方?...
我期待从不同服务器连接两个不同的数据库.此外,我想运行一个查询,从两个数据库中获取数据到一个单一的结果.我正在使用mysql在PHP脚本中执行此操作.这里是如何很期待做[没有成功:)]如何连接多个数据 ...
- mysql中递增列_如何使用JDBC在MySQL中创建带有自动递增列的表?
在创建表时,在某些情况下,我们需要自动生成/增加列的值(例如ID).各种数据库以不同的方式支持此功能. 在MySQL数据库中,您可以使用以下语法声明列自动递增.CREATE TABLE table_n ...
- mysql创建独立表空间_InnoDB独立表空间
在查看MySQL的数据库文件的时候会发现,MyISAM存储引擎类型的表会有三个文件,*.frm,*.MYD,*.MYI,但是InnoDB存储引擎的文件只有一个*.frm,原来是因为InnoDB没有开启 ...
- mysql中如何删除空记录表_mysql删除表中的记录
大家都知道,在MySQL中删除一个表中的记录有两种方法,一种是DELETE FROM TABLENAME WHERE... , 还有一种是TRUNCATE TABLE TABLENAME. DELET ...
最新文章
- 股市币市:数据分析与交易所最新公告(20190228)
- 产品经理_(pm)—原型设计软件_Axure 9_axure rp pro 9.0中文破解版安装
- Android 教程
- 2019年备受关注的5个IT系统灾难恢复技术趋势
- JQuery链式操作简单的菜单列表
- AtCoder Beginner Contest 192 F - Potion 背包dp
- 刀剑神域服务器维护到什么时候,刀剑神域黑衣剑士王牌维护结束时间 服务器维护进不去怎么办...
- 与ea服务器连接中断770,测试ea出现 There has been a critical error 这是什么错误?如何解决? 谢谢!...
- RMDB与hadoop的实时整合
- CMake快速入门教程-实战
- mysql必知必会学习笔记
- IOS网络——检测网络状态:Reachability
- XILINX VIVADO2018.2官方下载全教程记录.
- Windows XP Nlite 2007珍藏版 BY 丘比特
- 每日一字:biáng
- Windows防火墙开关及入站规则
- 《三体》中的经典名句
- 高档微型计算机,五款中高端声卡综合横向评测
- Python学习(中一)
- 2022-09-15 mysql列存储引擎-语法树转换