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 要在创建表之前修改,创建表之后再去修改,是不会影响已有的表结构的。

该用哪一个?

要搞明白要用哪一种表空间,我们得先明白两种不同表空间各自的特点。

独立表空间

优势

  1. 每张表都有自己独立的表空间。

  2. 每张表的数据和索引都会存储在自己的表空间中。

  3. 可以实现单表在不同的数据库中移动(因为每张表都有独立的数据表文件)。

  4. 空间可以回收(通过 optimize table 命令实现)。

  5. 无论怎么删除,表空间的碎片不会太严重影响系统性能。

缺点

  1. 单表增加过大。

共享表空间

优势

  1. 可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同的文件上)。

  2. 数据和文件放在一起方便管理。

缺点

  1. 所有的数据和索引存放到一个文件中,这将意味着有一个很大的文件存在(虽然可以把一个大文件分成多个小文件),但是多个表及索引在表空间中混合存储,这样当一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析、日志系统这类应用而言,最不适合用共享表空间(例如,当系统空间不够用的时候,我们希望通过删除一些无效数据来腾出来一些表空间,这个时候我们会发现,如果使用了共享表空间,即使无效数据删除了,表空间还是还是不会缩小)。

  2. 共享表空间管理会出现表空间分配后不能回缩的问题,当临时建立索引或者临时表导致表空间扩大后,就是删除相关的表也没办法回缩那部分空间了。

  3. 对于第二点存在的问题,一般使用 mysqldump 导出数据,然后删除共享表空间数据文件后,再重新导入。

  4. 由于一个文件中保存了多个表数据,所以并发操作时可能会产生 IO 瓶颈,所以需要频繁写入的场景并不适合共享表空间。

经过以上的分析,相信小伙伴们已经明白了,在实际项目中,还是首选独立表空间比较好,事实上,从 MySQL5.6 开始,独立表空间就已经成为默认选项了。

迁移

最后还有一个问题,如果一开始创建的是共享表空间,那么还能迁移到独立表空间吗?当然可以!参考如下四个步骤:

  1. 使用 mysqldump 导出所有数据库表数据。

  2. 停止 MySQL 服务,修改 innodb_file_per_table参数,并删除 InnoDB 相关文件(如果是主从结构,则可以从 Slave 上入手完成这些操作)。

  3. 重启 MySQL 服务,重建 InnoDB 共享表空间(此时里边就没有数据了)。

  4. 重新导入数据。

好啦,今天就和小伙伴们聊一聊共享表空间和独立表空间,InnoDB 的其他玩法我们后面再继续介绍~



☞因融资失败,应用崩溃,3名程序员被“祭天”!☞iPhone 的续航有望加长!749 元的“磁吸充电宝”你会买吗?
☞iPhone 13或有日落金玫瑰金配色;传阿里巴巴和腾讯考虑互相开放生态系统;抖音内测“心动外卖”|极客头条
  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易但是深入较难如何写出高效率爬虫如何写出灵活性高可扩展爬虫都是一项技术活。另外在爬虫过程经常容易遇到被反爬虫比如字体反爬、IP识别、验证码等如何层层攻克难点拿到想要数据这门课程你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业开发者比如app开发web开发学习爬虫能让你加强对技术认知能够开发出更加安全软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整爬虫程序无论大小总体来说可以分成三个步骤分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来数据进行过滤提取我们想要数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到数据存储到硬盘或者内存。比如mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进进行讲解带领学生完整掌握每个步骤技术。另外因为爬虫多样性在爬取过程可能会发生被反爬、效率低下等。因此我们又增加了两个章节来提高爬虫程序灵活性分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理多线程爬虫图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶知识点我们能应付大量反爬网站而Scrapy框架作为一个专业爬虫框架使他可以快速提高我们编写爬虫程序效率和速度。另外如果一台机器不能满足你需求我们可以分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应爬虫本套课程满足您所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值