1. 程式人生 > >mysql儲存引擎及優化

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
[[email protected] ~]# 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語句的執行都會導致此表會重建,即使表空間的屬性和之前是一樣的。