mysql innodb學習(四)

前面介紹了一下innodb的內存緩存區和日誌文件,這篇主要記錄一下innodb的表空間(tablespace),顧名思義,表空間就是存儲表的,innodb的表空間不單單存儲了數據和索引,還存儲了重作日誌,插入緩存,doublewrite緩存以及其餘的一些內部數據結構。mysql

innodb主要使用下面兩個參數來配置表空間:sql

innodb_data_home_dir = /var/lib/mysql <BR>innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend緩存

這兩個選項配置了innodb的數據目錄在/var/lib/mysql下,有2個數據文件ibdata1和ibdata2,大小都是以1G,可是ibdata2能夠自動擴展。咱們還能夠把不一樣的文件放到不一樣的磁盤分區,例如服務器

<BR>innodb_data_file_path = /disk1/ibdata1:1G;/disk2/ibdata2:1G:autoextend數據結構

<BR>數據文件分佈在不一樣的磁盤分區,咱們可能會認爲這能起到分散負載的做用,可是遺憾的是這並無起到應有的效果,由於innodb操做數據文件的方式爲首尾相連的,即會把第一個文件先寫滿,而後再寫第二個文件,所以負載並無分散到不一樣的磁盤(有一個好的方式就是能夠採用RAID的方式來實現分散負載)。工具

咱們能夠看到第一個數據文件的大小是固定的,第二個文件的大小自動擴展的,那這樣就可能會出現第二個文件會增加成一個很大的文件,可能會很差管理,所以咱們可能須要給數據文件設置一個最大值性能

<BR>innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend:max:5Gspa

這樣就設置了ibdata2的最大限制爲5G,這裏有個問題就是,當咱們刪除一些表和數據後,咱們怎麼回收刪除後留下的空間呢,ibdata2文件的大小爲5G,可是可能其中有不少空閒的空間,那咱們怎麼回收呢?日誌

innodb不容許咱們直接修改文件的大小,咱們只能是先把數據dump出來(經過mysqldumo工具),而後修改mysql的配置文件,從新設置數據文件的大小,而後再把數據從新導回去。innodb還有一個限制就是咱們不能直接像myisam那樣直接把數據文件簡單的拷貝到其餘的機器上來實現數據拷貝的目的,由於mysql啓動時會檢測到若是實際的數據文件大小跟配置文件中設置的大小不一致的話,那就會致使mysql沒法啓動。索引

innodb還提供一個參數innodb_file_per_table,這個選項使得innodb能爲每一個表存儲爲一個單獨的文件tablename.ibd,可是要注意的是,ibd文件僅僅存儲了表的數據、索引插入緩衝等,其他的數據仍是存儲在共享表空間中。

單個文件的優勢: <BR>1.當咱們刪除一個表的時候,就刪除了對應表的ibd文件,那咱們就能回收刪除後留下的空間了 <BR>2.就是咱們能把不一樣的表文件放到不一樣磁盤分區上,這樣便可實現分散負載的效果了 <BR>3.咱們能直接把數據文件移動到另一臺設置了這個選項的服務器上,達到拷貝的目的 <BR>4.咱們還能經過查看文件的大小了解表的大小,相比於使用共享表空間的只能使用show table status查看,這個操做將須要更多的工做來計算給這個表分配了多少頁的數據

缺點: <BR>1.這個設置將會使用更多的磁盤空間,由於每一個表都會產生碎片,innodb處理碎片也是在每一個表的ibd文件中,當咱們有不少小的表的時候,這個狀況會更明顯,由於innodb表空間的頁大小爲16K,即便咱們的表大小隻有1K,那也要至少佔用16K的空間,這就會浪費不少的磁盤空間 <BR>2.刪除表的性能問題,刪除表的時候要在文件系統級別刪除ibd文件,這個操做在有點文件系統上會很慢(好比ext3),對於這個問題,有一個折中的方法就是在文件系統級別將文件的大小設置爲0,而後再手動刪除文件

那有沒有好的推薦配置呢?一個建議就是設置innodb_file_per_table,而後設置一個固定值的innodb_data_file_path,實際狀況能夠根據具體的負載來設置。

相關文章
相關標籤/搜索