mysql存儲引擎及優化

一、mysql存儲引擎

1、mysql存儲引擎

         MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供不同的功能。通過選擇不同的技術,能夠獲得額外的速度或者功能,從而改善應用的整體功能。Mysql中主要的存儲引擎有InnoDB(5.7版本中默認)、MyISAM、MEMORY、CSV等。

# 查看mysql中存儲引擎
mysql> show engines\G
*************************** 1. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 9. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
9 rows in set (0.00 sec)

2、mysql主要存儲引擎介紹

(1)InnoDB

         InnoDB是目前MySQL版本默認的存儲引擎,也是MySQL推薦使用的存儲引擎,是集高可靠性和高性能於一身的存儲引擎。

InnoDB存儲引擎的優勢:

         1)DML語句支持事務功能,保證ACID特性

         2)行級鎖的使用保證了高併發的屬性

         3)InnoDB對有主鍵的表會依據主鍵優化查詢性能,也稱聚簇索引,將所有數據存儲在聚簇索引上以減少對主鍵查詢的IO消耗

         4)保證數據的一致性:InnoDB支持外鍵屬性

         5)能夠保證數據的完整性:主機故障導致MySQL重啓後,InnoDB會自動識別已經在故障之前提交的數據,並回退所有故障時未提交的數據,最大限度的保護數據不會丟失(crash recovery)

(2)MyISAM

         MyISAM存儲引擎是MySQL老版本中的默認存儲引擎,由於其表級鎖的特性,所以限制了其在讀寫操作時的性能,常用在只讀表上或者讀操作佔絕大多數的表上,比如一些web應用和數據倉庫相關表。

         每個MyISAM表都會在磁盤上生成三個文件,表名和文件名相同但後綴不同,.frm文件存儲表的結構信息,.MYD文件存儲表的數據信息,.MYI文件存儲表的索引信息

(3)Memory

         Memory存儲引擎將所有數據存儲在內存中以便加快對數據的訪問速度, 當MySQL重啓時,Memory表中的數據會丟失,但表結構還在; Memory只適用在只讀表或者讀操作佔絕大多數的情況,因爲對錶的寫操作也會導致表鎖,大大限制了併發性。

         Memory表創建之後,在磁盤文件會生成一個相同表名的文件,後綴爲.frm,僅存儲表結構而不存儲表數據。

(4)CSV

         Csv存儲引擎下的表對應了文本文件,其中的數據用逗號隔開,csv表可用來以csv格式導入和導出表

         創建一個csv表時,磁盤會生成三個以表名爲名字的文件,.frm存儲表的結構信息;.CSV文件存儲以逗號隔開的數據信息;.CSM存儲表的元數據,包括表的狀態和有多少行數據信息。

(5)ARCHIVE

         Archive存儲引擎表用來存儲大量未加索引的歷史歸檔數據。Archive表支持insert, replace和select語句,但不支持delete和update語句;Archive表支持行級鎖;Archive支持auto_incrment列,且其列上可以包含一個索引,但在其他字段上不能創建索引;Archive不支持對auto_incrment列插入一個小於當前最大值的數據;Archive存儲引擎會用zlib來壓縮數據。

         archive表會在磁盤創建兩個文件,.frm文件用來存儲表結構信息,.ARZ文件用來存儲歷史歸檔數據。

(6)Blackhole

         Blackhole存儲引擎用來接收表插入請求,但不存儲數據,所以查詢表數據總是返回空,通常用在主從複製的情況下當主庫不想保留數據而從庫通過複製語句執行而保留數據的情況。

         Blackhole表在磁盤會創建一個文件,.frm文件用來存儲表結構。

(7)Merge

         Merge存儲引擎可以將一批字段相同,索引相同且順序相同的MyISAM表在邏輯上看做是同一個;Merge表支持select,delete,update,insert語句執行;

         Merge表在磁盤上創建兩個文件,.frm文件保存表的結構信息,.MRG文件包含所有被視作同一個表的MyISAM表。

(8)Federated

         Federated存儲引擎提供了從一個MySQL實例連接其它實例上數據的能力,Federated存儲引擎默認是disable狀態,如果要開啓,則需要在啓動MySQL時使用—federated選項。

(9)Example

         Example存儲引擎只存在於MySQL源碼中,只針對開發者,對實際的數據庫使用者沒有太大的意義,Example表只保留表結構,本身不保存數據。

(10)NDB

         NDB存儲引擎專用在MySQL Cluster軟件中,是MySQL自己推出的提高可用性和可靠性的集羣軟件。

3、設置mysql表的存儲引擎

         1)在my.cnf配置文件中設置default-storage-engine參數表示設置默認存儲引擎

         2)在MySQL的連接上設置當前連接的默認存儲引擎:SET default_storage_engine=NDBCLUSTER;

         3)在創建表的時候通過engine=語句指定該表的存儲引擎

         4)在表創建之後通過alter語句修改表的存儲引擎:ALTER TABLE table_name ENGINE = InnoDB。

二、InnoDB存儲引擎的屬性與調優

1、InnoDB主要屬性

         InnoDB的關鍵屬性包括:

         1)ACID事務特性支持,包括commit,rollback以及crash恢復的能力;

         2)行級別鎖以及多版本併發控制MVCC;

         3)利用主鍵的聚簇索引(clustered index)在底層存儲數據,提升對主鍵查詢的IO性能;

         4)支持外鍵功能,管理數據的完整性。

# 開啓事務
mysql> start transaction;
mysql> update students set gender=1;
#查看更新後的數據
mysql> select * from students;
+------+-------+--------+---------+
| sid  | sname | gender | dept_id |
+------+-------+--------+---------+
|    1 | mike  | 1      |       1 |
|    2 | mike  | 1      |       2 |
|    3 | mike  | 1      |       1 |
+------+-------+--------+---------+
# 回滾
mysql> rollback;
# 查看回滾後的數據
mysql> select * from students;
+------+-------+--------+---------+
| sid  | sname | gender | dept_id |
+------+-------+--------+---------+
|    1 | mike  | 0      |       1 |
|    2 | mike  | 1      |       2 |
|    3 | mike  | 0      |       1 |
+------+-------+--------+---------+

         爲保證併發操作和回滾操作,InnoDB會將修改前的數據存放在回滾段中。InnoDB會在數據庫的每一行上額外增加三個字段以實現多版本控制,第一個字段是DB_TRX_ID用來存放針對該行最後一次執行insert、update操作的事務ID(delete操作也會被認爲是update);第二個字段是DB_ROLL_PTR指針指向回滾段裏對應的undo日誌記錄;第三個字段是DB_ROW_ID代表每一行的行ID。

         回滾段中的undo日誌記錄只有在事務commit提交之後纔會被丟棄,爲避免回滾段越來越大,要注意及時執行commit命令。

2、InnoDB的體系結構

(1)緩存池

         buffer pool緩存池是InnoDB在內存中開闢的用來緩存表數據和索引數據的區域,一般設置爲50%~80%的物理內存大小,通過將經常訪問的數據放置到內存當中來加快訪問速度。

         Buffer pool以page頁的格式組成,頁之間組成list列表,並通過LRU算法(最近最少使用算法)對長久不使用的頁進行置換。數據以整頁(16K)位單位讀取到緩存中。

(2)Adaptive Hash Index(自適應哈希索引)

         Adaptive Hash index屬性使得InnoDB更像是內存數據庫。該屬性通過innodb_adapitve_hash_index開啓,也可通過—skip-innodb_adaptive_hash_index參數關閉

        InnoDB存儲引擎會監控對錶上索引的查找,如果觀察到建立哈希索引可以帶來速度的提升,則建立哈希索引,所以稱之爲自適應(adaptive) 的。自適應哈希索引通過緩衝池的B+樹構造而來,因此建立的速度很快。而且不需要將整個表都建哈希索引,InnoDB存儲引擎會自動根據訪問的頻率和模式 來爲某些頁建立哈希索引。
(3)Redo log buffer

         Redo log buffer是一塊用來存放寫入redo log文件內容的內存區域,

         配置參數:    

                   innodb_log_buffer_size:內存的大小

                   innodb_flush_log_at_trx_commi:刷新到文件的方式

                   innodb_flush_log_at_timeou:刷新的頻率

(4)Doublewrite緩存

         Doublewrite緩存是位於系統表空間的存儲區域,用來緩存InnoDB的數據頁從innodb buffer pool中flush之後並寫入到數據文件之前,所以當操作系統或者數據庫進程在數據頁寫磁盤的過程中崩潰,Innodb可以在doublewrite緩存中找到數據頁的備份而用來執行crash恢復。

(5)Undo日誌

         Undo日誌是由一系列事務的undo日誌記錄組成,每一條undo日誌記錄包含了事務數據回滾的相關原始信息,所以當其它的事務需要查看修改前的原始數據,則會從此undo日誌記錄中獲取

         Innodb支持最大128個回滾段,其中的32個用來服務臨時表的相關事務操作。

Undo log原理:爲了滿足事務的原子性,在操作任何數據之前,首先將數據備份到一個地方(這個存儲數據備份的地方稱爲Undo Log)。然後進行數據的修改。如果出現了錯誤或者用戶執行了ROLLBACK語句,系統可以利用Undo Log中的備份將數據恢復到事務開始之前的狀態。

(6)File-per-table表空間

         File-per-table表空間意味着innodb的數據表不是共享一個系統表空間,而是每個表一個獨立的表空間。可以通過設置innodb_file_per_table開啓此屬性。

# File-per-table獨立表空間默認是開啓的
mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+

(7)temporary表空間

         temporary臨時表空間用來存放臨時表,默認情況下是在數據文件夾下的ibtmp1數據文件,此數據文件被設置爲每次自動增長12MB大小。臨時表空間文件在正常的shutdown之後會自動清除,但在crash發生時不會清除,這就需要DBA手動去刪除表空間文件或重啓服務器。

(8)redo log

         redo日誌是存在於磁盤上的文件,包括ib_logfile0和ib_logfile1兩個文件,常用於在crash恢復發生時將還沒來得及寫入到數據文件中但已經完成提交的事務在數據庫初始化時重新執行一遍。

         InnoDB對redo log buffer寫入到redo log文件的方式提供了組提交(group commit)的方式,意味着針對一次寫磁盤操作可以包含多個事務數據,用此方法提高性能。

3、InnoDB持久化

         爲了IO效率,數據庫修改的文件都在內存緩存中完成的;如果出現宕機,數據的持久化是通過讀取日誌文件中沒有被持久化到數據文件裏面的記錄;將這些記錄重新持久化到數據文件中。

配置:

         innodb_flush_log_at_trx_commit:配置的值有(0|1|2)分別代表每秒寫入並持久化一次,每次commit都持久化,每次commit都寫入內存的內存緩存,每秒再刷新到磁盤。

         innodb_flush_log_at_timeout:最多丟失多少秒的數據,默認是一秒

4、存儲引擎的相關配置

(1)mysql配置文件的優先級

Filename

Purpose

讀取順序

優先級

/etc/my.cnf

Global options

最先

最低

/etc/mysql/my.cnf

Global options

依次降低

依次升高

SYSCONFDIR/my.cnf

Global options

$MYSQL_HOME/my.cnf

Server-specific options

defaults-extra-file

The file specified with --defaults-extra-file=path, if any

~/.my.cnf

User-specific options

~/.mylogin.cnf

Login path options

最後

最高

(2)系統表空間數據文件配置

    配置選項:

           innodb_data_home_dir:配置系統表空間文件的存放路徑,默認是MySQL安裝後的數據文件目錄,也可以在innodb_data_file_path中指定絕對路徑的數據文件。

           Innodb_data_file_path=file_name:file_size[:autoextend[:max:max_file_size]]:配置系統表空間的配置文件,可以包含一個或多個數據文件,中間用;號分開,autoextend和max選項只能用作最後的這個數據文件。Autoextend默認情況下是一次增加64MB,如果要修改此值可通過innodb_autoextend_increment參數。Max用來指定可擴展數據文件的最大容量用來避免數據文件大小超過可用磁盤空間大小。

# 配置系統表空間如下
[mysqld]
innodb_data_home_dir = /data/myibdata/
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

(3)redo日誌文件配置

         默認情況下InnoDB會在數據文件夾下創建兩個48M的日誌文件,分別是ib_logfile0和ib_logfile1。

         配置選項:

                   Innodb_log_group_home_dir:指定redo日誌的文件位置

                   innodb_log_files_in_group:定義日誌文件的個數,默認和推薦值都是2

                   innodb_log_file_size:定義每個日誌文件的大小,日誌文件越大意味着buffer pool進行文件間切換的操作越少,從而減少IO。

(4)undo表空間

         默認情況下,undo日誌是存放在系統表空間裏,但也可以選擇在獨立的一個或多個undo表空間中存放undo日誌。

         配置選項:

                   Innodb_undo_directory:設置獨立的undo表空間存放目錄

                   Innodb_undo_logs:設置回滾段的個數,該變量可以動態調整

                   Innodb_undo_tablespaces:設置獨立undo表空間的個數,比如設置爲16時則會在undo表空間存放目錄下創建16個undo文件,默認爲10M

         臨時表空間:默認情況下,innodb會創建一個自增長的ibtmp1文件在數據文件夾下作爲臨時表空間數據文件。

         臨時表空間配置:

                   Innodb_temp_data_file_path:設置臨時表文件路徑,文件名和文件大小,設置方法同系統表空間設置

(5)數據頁配置

         Innodb_page_size參數用來指定所有innodb表空間的數據頁大小。默認是16K大小,也可以設置爲64K、32K、8K和4K。一般設置爲存儲磁盤的block size接近的大小.

(6)設置InnoDB只讀

         InnoDB可以通過—innodb-read-only參數設置數據表只能讀取。

# 通過表設置InnoDB表只讀
[mysqld]
innodb-read-only=1

(7)InnoDB buffer pool設置

         Buffer pool是內存中用來緩存數據和索引的存儲區域,是MySQL性能調優的重要一環。Buffer pool的底層是一個列表,通過LRU算法進行數據頁的換進換出操作。當空間原因導致新頁的加入需要換出一頁時,InnoDB取出最近最少使用的頁並將這個新的數據頁加入到列表的中央。

         配置參數:

                   Innodb_buffer_pool_size:設置緩存表數據和索引數據的內存區域大小,默認爲128M,推薦設置爲系統內存的50%~80%。大小設置也可以通過動態設置或啓動mysql時設置。

                   innodb_buffer_pool_chunk_size:增加和減少buffer pool的大小

                   Innodb_buffer_pool_instances:配置多個buffer pool實例,的默認值是1,最大可以調整成64

                   innodb_old_blocks_pct:控制列表中”old”數據頁所佔的百分比,默認是37%,等同於3/8,取值範圍是5~95

                   Innodb_old_blocks_time:設置頁面讀取到buffer pool後但沒有移動到經常被訪問列表位置的時間窗口,參數默認是1000毫秒

        Innodb_log_buffer_size:設置redo log緩存的大小,默認值是16M,其大小取決於是否有某些大的事務會大量修改數據而導致在事務執行過程中就要寫日誌文件

(8)InnoDB buffer pool預存取(read-ahead)

         Read ahead是異步預先獲取多個數據頁到buffer pool的IO操作,這些數據頁都是假定會隨後被用到的。InnoDB通過線性read ahead(預測哪些頁會被順序訪問)和隨機read ahead(通過已經在buffer pool中的數據頁來預測哪些頁會被隨後訪問到)兩種算法提高IO性能        設置參數:

                   innodb_read_ahead_threshold:調整順序數據頁的數量,默認值是56,取值範圍是0~64

                   innodb_random_read_ahead=ON:開啓隨機read ahead

(9)InnoDB buffer pool flushing配置

         Innodb會在後臺將buffer pool中的髒頁(已經修改但沒有寫到數據文件)flush掉。當buffer pool中的髒頁所佔百分比達到innodb_max_dirty_pages_pct_lvm會觸發flush,當所佔比例達到innodb_max_dirty_pages_pct時,則innodb會“強烈”的flush。

         設置選項:

                   Innodb_adaptive_flushing_lwm:爲防止redo log被填滿,如果redo log的容量超過此閾值,則執行adaptive flush操作。

(10)重置buffer pool狀態

         InnoDB可以通過配置innodb_buffer_pool_dump_at_shutdown參數來確保在mysql正常重啓時部分經常使用的數據頁能直接加載到buffer pool中,通過批量加載的方式,以節省重啓mysql導致的warmup時間

         配置選項:

                   innodb_buffer_pool_dump_pct:數據頁保留佔比,可通過通過配置

                   innodb_buffer_pool_dump_at_shutdown:默認是開啓的,也可動態配置

         在關閉MySQL時,會把內存中的熱數據保存在磁盤裏ib_buffer_pool文件中。數據庫運行期間保存和重新加載buffer pool的方法是:

                   SET GLOBAL innodb_buffer_pool_dump_now=ON;

                   SET GLOBAL innodb_buffer_pool_load_now=ON;

# 保存並從新加載
mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;
mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
# 查看buffer_poll保存和重新加載的進度
mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';
+--------------------------------+----------------------------------+
| Variable_name                  | Value                          
+--------------------------------+--------------------------------+
| Innodb_buffer_pool_dump_status | Buffer pool(s) dump completed at 180929 13:04:11 |
+--------------------------------+----------------------------------+
mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';    
+--------------------------------+----------------------------------+
| Variable_name                  | Value                                   
+--------------------------------+-------------------------------------+
| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 180929 13:04:13 |
+--------------------------------+------------------------------------+

(11)InnoDB change buffer設置

         當修改一個索引塊(secondary index)時的數據時,索引塊在buffter pool中不存在,修改信息就會被cache在change buffer中,當通過索引掃描把需要的索引塊讀取到buffer pool時,會和change buffer中修改信息合併,再擇機寫回disk。目的還是爲了減少隨機IO帶來性能損耗。Change buffer是作爲buffer pool中的一部分存在。

         配置選項:

                   Innodb_change_buffering:緩存所對應的操作,值有all:(默認值)  |inserts|deletes|changes:(緩存insert和delete操作)|purges(緩存後臺執行的物理刪除操作)

                   innodb_change_buffer_max_size:配置change buffer在buffer pool中所佔的最大百分比,默認是25%,最大可以設置爲50%

(12)InnoDB線程併發度配置

         InnoDB利用操作系統的線程技術達到多線程實現

         配置選項:

                   Innodb_thread_concurrency:限制同時執行的線程數。默認值是0代表沒有限制。

                   Innodb_thread_sleep_delay:參數確定

                   innodb_read_io_threads:後臺讀線程數,默認值是4,容許的取值範圍是1-64

                   innodb_write_io_threads:後臺寫線程數,默認值是4,容許的取值範圍是1-64

(13)使用Linux異步IO

         InnoDB在Linux平臺使用異步IO子系統完成數據文件頁的讀寫請求,默認是開啓狀態,並且需要libaio系統庫支持。

         配置選項:

                   innodb_user_native_aio

(14)InnoDB主線程配置

         InnoDB的主線程在後臺承擔了諸多的任務,絕大多數是和IO操作相關的,比如將buffer pool中的修改後的數據刷新的磁盤文件中。

         配置參數:

                   Innodb_io_capacity:設置了InnoDB的整體IO能力。該參數應該被設置爲等同於操作系統每秒的IO操作數量。可以設置爲100及以上的任意數值,默認值是200。其中設置爲100相當於7200RPM的磁盤性能。

(15)InnoDB purge配置

         InnoDB的purge操作是一類垃圾回收操作,是由一個或多個獨立線程自動執行。              配置選項:

                   innodb_purge_threads:設置purge線程的數量,如果DML操作比較複雜且涉及到多個表時,則可以考慮增加此值,最大可以設置爲32

(16)InnoDB 優化器統計信息配置

       Innodb表的優化器統計信息分爲永久和非永久兩種。永久的優化器統計信息即使是服務器重啓的情況下也會存在,其用來選出更優的執行計劃以便提供更好的查詢性能。

配置參數:

         innodb_stats_auto_recalc:控制統計信息是否在表發生巨大變化(超過10%的行)之後是否自動更新,但由於自動更新統計信息本身是異步的,所以有時未必能馬上更新,這是可以執行analyze table語句來同步更新統計信息。

         innodb_stats_persistent=ON:設置統計信息存儲在磁盤上

         innodb_stats_persistent_sample_pages:設置參與評估的數據頁的數量,默認值是20。當語句執行的執行計劃不是最優選擇時,則考慮增加此參數,以便獲得正確的統計資料。

         優化器永久統計資料數據在系統表mysql.innodb_table_stats和mysql.innodb_index_stats表中存儲,這兩個表中有個字段last_update可以用來判斷統計信息最後更改時間

(17)索引頁之間合併閾值

         通過配置merge_threshold來確保當索引頁的數據由於刪除操作或者修改操作低於閾值,InnoDB會將此索引頁和鄰近的索引頁合併。默認值是50,取值範圍是1到50。        Merge_threshold參數可以定義在表上,也可以定義在一個獨立的索引上。

         評估merge_threshold參數合理的方法是查看innodb_metrics表裏的相關參數,確保發生了較少的索引頁合併且合併請求和成功合併的數量相當

(18)配置單表數據文件表空間

         InnoDB的單表數據文件表空間代表每個InnoDB表的數據和索引數據都存放在單獨的.ibd數據文件中,每個.ibd數據文件代表獨立的表空間。

         優勢:當刪除表或者truncate表的時候,意味着對磁盤空間可以回收。而共享表空間時刪除一個表時空間不會釋放而只是文件裏有空閒

         缺點:每個表都有未使用的空間,意味着磁盤空間有些浪費

         配置選項:

                   innodb_file_per_table:值爲1時爲獨立表空間,爲0時則爲共享表空間。

         通過命令create table … data directory=’絕對路徑’可以將單表數據文件創建在另外的目錄裏。同時在MySQL的默認數據文件下的數據庫名文件夾下會創建table_name.isl文件包含了此表的路徑,相當於link文件。

# 在test表裏面創建test123表,將數據文件存放在/tmp下
mysql> create table test123 (id int primary key,name varchar(12)) DATA DIRECTORY = '/tmp';
]# ll /data/mysql/data/test/test123.*
-rw-r----- 1 mysql mysql 8586 Sep 30 02:23 /data/mysql/data/test/test123.frm
-rw-r----- 1 mysql mysql   21 Sep 30 02:23 /data/mysql/data/test/test123.isl
[root@localhost ~]# ll /tmp/test/test123*
-rw-r----- 1 mysql mysql 98304 Sep 30 02:23 /tmp/test/test123.ibd

(19)設置undo_log獨立表空間

         undo log默認是存儲在系統表空間裏,我們可以將其存放在一個或多個獨立表空間下。

         配置參數:

                   Innodb_undo_tablespaces:定義了有多少個undo表空間,此參數只能在建立MySQL實例時被配置

                   innodb_undo_directory:定義了undo表空間的存放路徑

                   innodb_undo_logs:定義了回滾段的數量

                   Innodb_undo_log_truncate:是否開啓undo表空間清空,如果設置爲ON後,則代表undo文件大小超過innodb_max_undo_log_size(默認值是128M)的都標記爲清空。

(20)InnoDB普通表空間

         通過create tablespace命令可以創建一個共享的InnoDB表空間,和系統表空間一樣,多個表可以在此表空間上存儲數據,此表空間的數據文件可以放置在任意的文件夾下。創建格式如下:

CREATE TABLESPACE tablespace_name
    ADD DATAFILE 'file_name'
    [FILE_BLOCK_SIZE = value]
        [ENGINE [=] engine_name]

         當創建完表空間之後,就可以通過create table …tablespace或者alter table … tablespace命令將表增加到此表空間上。

# 創建一個表空間
mysql> create tablespace test01 add datafile '/tmp/test/test01.ibd' Engine=InnoDB;    
# 將表test123的表空間移動表空間test01
mysql> alter table test123 tablespace test01;

         刪除表空間時用drop tablespace語句來執行,當刪除一個普通表空間時,首先需要保證此表空間上的所有表都被刪除,否則會報錯。

         通過alter table命令可以將InnoDB表在系統表空間、獨立表空間和普通表空間之間轉化:

         從系統表空間或者獨立表空間上轉移到普通表空間:

                   ALTER TABLE tbl_name TABLESPACE [=] tablespace_name 

        從普通表空間或者獨立表空間上轉移到系統表空間

                   ALTER TABLE tbl_name ... TABLESPACE [=] innodb_system

         從系統表空間或者普通表空間轉移到獨立表空間

                   ALTER TABLE tbl_name ... TABLESPACE [=] innodb_file_per_table

         Alter table … tablespace語句的執行都會導致此表會重建,即使表空間的屬性和之前是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章