自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL 中的共享表空間與獨立表空間,用哪個好呢?

數(shù)據(jù)庫 MySQL
對于 InnoDB 存儲引擎來說,它可以將每張表存放于獨立的表空間,即 tablename.ibd 文件;也可以將數(shù)據(jù)存放于 ibdata 的共享表空間,一般命名是 ibdataX,后面的 X 是一個具體的數(shù)字。

[[411180]]

我們今天就開始學(xué)習(xí) MySQL 中另外一個非常重要的存儲引擎 InnoDB 了。

要說 InnoDB,我們就不得不先來說說另外一個比較重要的話題表空間和共享表空間,這也是我們本文的主題。

1.獨立表空間與共享表空間

對于 InnoDB 存儲引擎來說,它可以將每張表存放于獨立的表空間,即 tablename.ibd 文件;也可以將數(shù)據(jù)存放于 ibdata 的共享表空間,一般命名是 ibdataX,后面的 X 是一個具體的數(shù)字。

我們先來體驗看看這兩種有什么區(qū)別。

首先我們執(zhí)行如下代碼可以查看是否開啟了獨立表空間:

  1. show variables like 'innodb_file_per_table'

可以看到,默認情況下,獨立表空間是開啟的。

這個時候我們來創(chuàng)建一個使用了 InnoDB 引擎的表,如下(默認存儲引擎就是 InnoDB):

  1. create table book(id int,name varchar(255)); 

創(chuàng)建完成后,我們來到存放數(shù)據(jù)文件的目錄下,可以看到如下文件:

可以看到,當前表被存放在獨立的 book.ibd 文件中。

存放于獨立表空間的表都將會以獨立文件的方式來進行存儲,每一個表都有一個 .frm 表描述文件(這個和 MyISAM 引擎一致),還有一個 .ibd 文件,這個文件包括了單獨一個表的數(shù)據(jù)內(nèi)容以及索引內(nèi)容,默認情況下它的存儲位置也是在表的位置之中。

接下來我們執(zhí)行如下代碼,修改 innodb_file_per_table 的值為 OFF,即關(guān)閉獨立表空間,如下:

關(guān)閉之后,再來創(chuàng)建新表:

  1. create table book2(id int,name varchar(255)); 

新表創(chuàng)建成功之后,此時我們再去表目錄下查看文件,發(fā)現(xiàn)并沒有一個名為 book2.ibd 的文件,說明此時的表已經(jīng)存放于共享表空間了。

那么共享表空間的 ibdata1 文件又在哪里呢?其實就在 MySQL 存放數(shù)據(jù)庫的目錄下:

我們可以通過如下命令查看 ibdata1 的默認大?。?/p>

  1. show variables like 'innodb_data_file_path'

可以看到,默認大小是 12M。

需要注意的是,innodb_file_per_table 要在創(chuàng)建表之前修改,創(chuàng)建表之后再去修改,是不會影響已有的表結(jié)構(gòu)的。

2.該用哪一個?

要搞明白要用哪一種表空間,我們得先明白兩種不同表空間各自的特點。

2.1 獨立表空間

優(yōu)勢

  • 每張表都有自己獨立的表空間。
  • 每張表的數(shù)據(jù)和索引都會存儲在自己的表空間中。
  • 可以實現(xiàn)單表在不同的數(shù)據(jù)庫中移動(因為每張表都有獨立的數(shù)據(jù)表文件)。
  • 空間可以回收(通過 optimize table 命令實現(xiàn))。
  • 無論怎么刪除,表空間的碎片不會太嚴重影響系統(tǒng)性能。

缺點

  • 單表增加過大。

2.2 共享表空間

優(yōu)勢

  • 可以將表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表可以分布在不同的文件上)。
  • 數(shù)據(jù)和文件放在一起方便管理。

缺點

  • 所有的數(shù)據(jù)和索引存放到一個文件中,這將意味著有一個很大的文件存在(雖然可以把一個大文件分成多個小文件),但是多個表及索引在表空間中混合存儲,這樣當一個表做了大量刪除操作后表空間中將會有大量的空隙,特別是對于統(tǒng)計分析、日志系統(tǒng)這類應(yīng)用而言,最不適合用共享表空間(例如,當系統(tǒng)空間不夠用的時候,我們希望通過刪除一些無效數(shù)據(jù)來騰出來一些表空間,這個時候我們會發(fā)現(xiàn),如果使用了共享表空間,即使無效數(shù)據(jù)刪除了,表空間還是還是不會縮小)。
  • 共享表空間管理會出現(xiàn)表空間分配后不能回縮的問題,當臨時建立索引或者臨時表導(dǎo)致表空間擴大后,就是刪除相關(guān)的表也沒辦法回縮那部分空間了。
  • 對于第二點存在的問題,一般使用 mysqldump 導(dǎo)出數(shù)據(jù),然后刪除共享表空間數(shù)據(jù)文件后,再重新導(dǎo)入。
  • 由于一個文件中保存了多個表數(shù)據(jù),所以并發(fā)操作時可能會產(chǎn)生 IO 瓶頸,所以需要頻繁寫入的場景并不適合共享表空間。

經(jīng)過以上的分析,相信小伙伴們已經(jīng)明白了,在實際項目中,還是首選獨立表空間比較好,事實上,從 MySQL5.6 開始,獨立表空間就已經(jīng)成為默認選項了。

3.遷移

最后還有一個問題,如果一開始創(chuàng)建的是共享表空間,那么還能遷移到獨立表空間嗎?當然可以!參考如下四個步驟:

  • 使用 mysqldump 導(dǎo)出所有數(shù)據(jù)庫表數(shù)據(jù)。
  • 停止 MySQL 服務(wù),修改 innodb_file_per_table 參數(shù),并刪除 InnoDB 相關(guān)文件(如果是主從結(jié)構(gòu),則可以從 Slave 上入手完成這些操作)。
  • 重啟 MySQL 服務(wù),重建 InnoDB 共享表空間(此時里邊就沒有數(shù)據(jù)了)。
  • 重新導(dǎo)入數(shù)據(jù)。

好啦,今天就和小伙伴們聊一聊共享表空間和獨立表空間,InnoDB 的其他玩法我們后面再繼續(xù)介紹~

本文轉(zhuǎn)載自微信公眾號「江南一點雨」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系江南一點雨公眾號。

 

責任編輯:武曉燕 來源: 江南一點雨
相關(guān)推薦

2020-03-22 21:46:06

MySQLInnoDB表空間

2010-11-23 13:57:50

MySQL獨立表空間

2021-01-08 08:10:34

MySQL表空間回收

2021-09-08 19:35:02

MySQL Keyring加密

2019-07-11 10:44:23

Oracle表空間數(shù)據(jù)庫

2016-12-27 15:47:19

臨時表空間數(shù)據(jù)

2010-11-16 11:32:54

ORACLE增加表空間

2010-11-16 10:32:01

Oracle創(chuàng)建表空間

2010-09-01 14:46:16

DB2表空間

2009-05-21 09:24:42

表空間查詢Oracle

2022-10-19 21:24:24

臨時表空間Oracle

2011-08-23 10:54:16

PostgreSQL表空間用戶

2010-10-29 10:22:21

Oracle表空間

2010-10-27 14:41:45

Oracle查詢用戶表

2010-04-15 14:18:30

Oracle創(chuàng)建

2010-11-16 11:17:41

Oracle表空間大小

2010-04-15 14:39:56

Oracle創(chuàng)建表空間

2010-11-01 16:07:22

DB2表空間

2010-11-16 10:15:24

oracle創(chuàng)建表空間

2011-07-18 15:59:17

MySQL數(shù)據(jù)庫
點贊
收藏

51CTO技術(shù)棧公眾號