今天研究下關於mysql數據的相關參數以及innodb引擎下的共享表空間和獨立表空間介紹,
參數主要包括innodb_data_file_path、innodb_data_home_dir、innodb_buffer_pool_size、innodb_buffer_pool_instances四個參數。
一:首先介紹innodb_buffer_pool_size 咱們知道mysql數據庫在操做數據頁的時候,會先把數據頁pin到內存中,以後再作相關的處理,那麼mysql可使用的mysql的內存大小就是由innodb_buffer_pool_size參數控制的,
這個參數主要做用是緩存innodb表的索引,數據,插入數據時的緩衝。在高併發高I/O時正確的配置很是重要,可能帶來很大的性能提高,這是InnoDB最重要的設置,對InnoDB性能有決定性的影響。
默認的設置只有8M,因此默認的數據庫設置下面InnoDB性能不好。在只有 InnoDB存儲引擎的數據庫服務器上面,能夠設置60-80%的內存。這個參數是非動態的,要修改這個值,須要重啓mysqld服務
# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and # row data. The bigger you set this the less disk I/O is needed to # access data in tables. On a dedicated database server you may set this # parameter up to 80% of the machine physical memory size. Do not set it # too large, though, because competition of the physical memory may # cause paging in the operating system. Note that on 32bit systems you # might be limited to 2-3.5G of user level memory per process, so do not # set it too high. #innodb,不像myisam,使用緩衝池來緩存索引和 #行數據。您設置的越大,那麼訪問表中的數據所需的磁盤I /o就越少。 #在專用的數據庫服務器上,您能夠設置這個 #參數最多80%的計算機物理內存大小。不要設置它 #太大了,由於物理內存的競爭可能 #致使操做系統中的分頁。注意,在32位系統上 #可能僅限於每一個進程的2-3.5g用戶級內存,因此不要 把它定得過高了。
二:innodb_data_home_dir和innodb_data_file_path參數 innodb_data_file_path用來指定innodb 共享 表空間文件,若是咱們不在My.cnf文件中指定innodb_data_home_dir和innodb_data_file_path那麼默認會在datadir目錄下建立ibdata1
做爲innodb tablespace。 雖然不指定innodb_data_home_dir和指定它爲空顯示是同樣的,可是做用確不同,若是不指定那麼全部的innodb tablespace 文件只能存放在datadir目錄下。
若是顯示指定爲空,則能夠爲innodb tablespace 文件指定不一樣的路徑 1. 在同一個路徑下指定多個innodb tablespace 文件 1) 在my.cnf文件指定以下 [mysqld] innodb_data_file_path = ibdata1:1G;ibdata2:12M:autoextend:max:500M note:The autoextend and max attributes can be used only for the last data file in the innodb_data_file_path line. note:由於沒有指定innodb_data_home_dir,因此ibdata1和ibdata2都在datadir(innodb_data_home_dir默認值爲datadir)目錄下建立 2) 在my.cnf文件指定以下 [mysqld] innodb_data_home_dir = /data/mysql/mysql3306/data innodb_data_file_path = ibdata1:1G;ibdata2:12M:autoextend:max:500M note:能夠顯示的指定innodb tablespace文件的路徑,若是指定innodb_data_home_dir,那麼就不能爲innodb tablespace不一樣文件指定不一樣路徑 2. 在不一樣路徑下指定innodb tablespace 在my.cnf文件下指定 [mysqld] innodb_data_home_dir = innodb_data_file_path = ibdata1:12M;/data/mysql/mysql3306/data1/ibdata2:12M:autoextend note:若是想爲innodb tablespace指定不一樣目錄下的文件,必須指定innodb_data_home_dir =。這個例子中會在datadir下創建ibdata1,在/data/mysql/mysql3306/data1/目錄下建立ibdata2 若是我不指定innodb_data_home_dir =,只在my.cnf文件中作以下指定: innodb_data_file_path =/data/data/ibdata1:18m;/data/data/1ibdata2:100m:autoextend:max:2000M bogon:root@~>service mysqld start Starting MySQL. ERROR! The server quit without updating PID file (/tmp/mysql.pid). 查看錯誤日誌。。。以下 bogon:root@/>tail -n 100 /data/log/error.log
171127 21:08:16 InnoDB: Operating system error number 2 in a file operation. InnoDB: The error means the system cannot find the path specified. InnoDB: If you are installing InnoDB, remember that you must create InnoDB: directories yourself, InnoDB does not create them. InnoDB: File name .//data/data/ibdata1 InnoDB: File operation call: 'create'. InnoDB: Cannot continue operation. ##因此若是想爲innodb tablespace文件指定不一樣路徑,那麼必須在my.cnf文件中指定innodb_data_home_dir = 注意: 1)設定文件大小時必定要注意你的OS是否有最大文件尺寸爲2GB的限制!InnoDB是不會注意你的OS文件尺寸限制的, 在一些文件系統中你可能要設定最大容量限制: innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M 2)若是是修改共享表空間的文件個數,注意在描述原來文件的時候,必定要找到該文件,查看他當前的實際大小,而後寫在innodb_data_file_path =哪一個文件的後面。不然會報錯。
三:innodb_buffer_pool_instances innodb緩衝池被劃分爲多個內存緩衝池的數量。對於具備多GB範圍的緩衝池的系統,將緩衝池劃分爲多個緩衝池能夠提升併發性,減小對不一樣線程讀取和寫入到緩存時頁面的爭用。
從緩衝池中存儲或讀取的每一個頁面都隨機分配給其中一個緩衝池實例,使用哈希函數。每一個緩衝池管理本身的自由列表、刷新列表、LRU和鏈接到緩衝池的全部其餘數據結構,
並由本身的buffer pool mutex(互斥體)保護。 只有當您將innodb _ buffer _ pool _size設置爲1gb或更高的大小時,此選項纔會生效。全部緩衝池的大小之和是您指定的總的緩存池大小。
爲了得到最佳效率,請指定innodb _ buffer _ pool _instances和innodb _ buffer _ pool _size的組合,以便每一個緩衝池實例至少爲1gb。 在MySQL 5.6.6以前,默認是1, 默認值 在MySQL 5.6.6和更高版本在32位系統取決於innodb_buffer_pool_size的值 1 innodb_buffer_pool_instances能夠開啓多個內存緩衝池,把須要緩衝的數據hash到不一樣的緩衝池中,這樣能夠並行的內存讀寫。 2 innodb_buffer_pool_instances 參數顯著的影響測試結果,特別是很是高的 I/O 負載時。 3 實驗環境下, innodb_buffer_pool_instances=8 在很小的 buffer_pool 大小時有很大的提高,而使用大的 buffer_pool 時,innodb_buffer_pool_instances=1 的表現最棒。
最後說說mysql的innodb引擎下的表空間:
1、針對innodb引擎,分爲兩種狀況一種是共享表空間存儲方式,還有一種是獨享表空間存儲方式。 共享表空間: Innodb的全部數據保存在一個單獨的表空間裏面,而這個表空間能夠由不少個文件組成,一個表能夠跨多個文件存在,因此其大小限制再也不是文件大小的限制,而是其自身的限制。
從Innodb的官方文檔中能夠看到,其表空間的最大限制爲64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,固然這個大小是包括這個表的全部索引等其餘相關數據。 獨立表空間: 而當使用獨享表空間來存放Innodb的表的時候,每一個表的數據以一個單獨的文件來存放,這個時候的單表限制,又變成文件系統的大小限制了 針對myasam引擎: MySQL單表最大限制就已經擴大到了64PB了(官方文檔顯示)。也就是說,從目前的技術環境來看,MySQL數據庫的MyISAM存儲 引擎單表大小限制已經不是有MySQL數據庫自己來決定,
而是由所在主機的OS上面的文件系統來決定了。
2、查看數據庫的表空間 MySQL [(none)]> show variables like 'innodb_data%'; +-----------------------+----------------------------------------------------------------------+
| Variable_name | Value |
+-----------------------+----------------------------------------------------------------------+
| innodb_data_file_path | /data/data/ibdata1:100m;/data/data1/ibdata2:100m:autoextend:max:2000M |
| innodb_data_home_dir | |
+-----------------------+----------------------------------------------------------------------+
表空間有四個文件組成:ibdata一、ibdata2每一個文件的大小爲100M,當ibdata1文件滿了的時候,ibdata2會自動擴展; 當前的存儲空間滿的時候,能夠在其餘的磁盤添加數據文件,語法以下:語法以下所示: pathtodatafile:sizespecification;pathtodatafile:sizespec;.;pathtodatafile:sizespec[:autoextend[:max:sizespecification]] 若是用 autoextend 選項描述最後一個數據文件,當 InnoDB 用盡全部表自由空間後將會自動擴充最後一個數據文件,每次增量爲 8 MB。示例: 無論是共享表空間和獨立表空間,都會存在innodb_data_file文件,由於這些文件不只僅要存放數據,並且還要充當着相似於ORACLE的UNDO表空間等一些角色。 3、共享表空間優缺點 既然Innodb有共享表空間和獨立表空間兩種類型,那麼這兩種表空間存在確定都有時候本身的應用的場景,存在即合理。如下是摘自mysql官方的一些介紹: 3.1 共享表空間的優勢 表空間能夠分紅多個文件存放到各個磁盤,因此表也就能夠分紅多個文件存放在磁盤上,表的大小不受磁盤大小的限制,方便擴容,放到多個磁盤磁盤上能夠分散io,提升性能。 3.2 共享表空間的缺點 全部的數據和索引存放到一個文件,雖然能夠把一個大文件分紅多個小文件,可是多個表及索引在表空間中混合存儲,當數據量很是大的時候,表作了大量刪除操做後表空間中將會有大量的空隙,
特別是對於統計分析,日誌系統這類應用最不適合用共享表空間,對於常常刪除操做的這類應用最不適合用共享表空間。 共享表空間分配後不能回縮:當出現臨時建索引或是建立一個臨時表的操做表空間擴大後,就是刪除相關的表也沒辦法回縮那部分空間了
(能夠理解爲oracle的表空間10G,可是才使用10M,可是操做系統顯示的表空間爲10G),進行數據庫的冷備很慢;
4、獨立表空間的優缺點 4.1 獨立表空間的優勢 每一個表都有自已獨立的表空間,每一個表的數據和索引都會存在自已的表空間中,能夠實現單表在不一樣的數據庫中移動。 空間能夠回收(除drop table操做外,表空不能自已回收) Drop table操做自動回收表空間,若是對於統計分析或是日誌表,刪除大量數據後能夠經過:alter table TableName engine=innodb;回縮不用的空間。 對於使innodb-plugin的Innodb使用turncate table也會使空間收縮。 對於使用獨立表空間的表,無論怎麼刪除,表空間的碎片不會太嚴重的影響性能; 4.2 獨立表空間的缺點 單表增長過大,當單表佔用空間過大時,存儲空間不足,只能從操做系統層面思考解決方法,好比作軟鏈接; 5、共享表空間和獨立表空間之間的轉換 5.1 查看當前數據庫的表空間管理類型 mysql> show variables like "innodb_file_per_table"; ON表明獨立表空間管理,OFF表明共享表空間管理;(查看單表的表空間管理方式,須要查看每一個表是否有單獨的數據文件) 5.2 修改數據庫的表空間管理方式 修改innodb_file_per_table的參數值便可,可是修改不能影響以前已經使用過的共享表空間和獨立表空間; innodb_file_per_table=1 爲使用獨佔表空間 innodb_file_per_table=0 爲使用共享表空間 題外話 碎片的產生: MySQL具備至關多不一樣種類的存儲引擎來實現列表中的數據存儲功能。每當MySQL從你的列表中刪除了一行內容,該段空間就會被留空。而在一段時間內的大量刪除操做,
會使這種留空的空間變得比存儲列表內容所使用的空間更大。當MySQL對數據進行掃描時,它掃描的對象實際是列表的容量需求上限,也就是數據被寫入的區域中處於峯值位置的部分。
若是進行新的插入操做,MySQL將嘗試利用這些留空的區域,但仍然沒法將其完全佔用。 針對oracle行連接和行遷移:新insert的時候,可能發生行連接;update已經存在的行時,可能發生行遷移; 行連接產生在第一次插入數據的時候若是一個block不能存放一行記錄的狀況下。這種狀況下,Oracle將使用連接一個或者多個在這個段中保留的block存儲這一行記錄,
行連接比較容易發生在比較大的行上,例如行上有LONG、LONG RAW、LOB等數據類型的字段,這種時候行連接是不可避免的會產生的。 當一行記錄初始插入的時候事能夠存儲在一個block中的,因爲更新操做致使行長增長了,而block的自由空間已經徹底滿了,這個時候就產生了行遷移。在這種狀況下,Oracle將會遷移整行數據到一個新的block中(假設一個block中能夠存儲下整行數據),Oracle會保留被遷移行的原始指針指向新的存放行數據的block,這就意味着被遷移行的ROW ID是不會改變的。 當發生了行遷移或者行連接,對這行數據操做的性能就會下降,由於Oracle必需要掃描更多的block來得到這行的信息。 總結:原來mysql也有相似於oracle的undo表空間,也就是innodb共享表空間(ibdata1),默認就是自動擴展的,每次擴展8M,共享表空間相似於oracle的表空間,能夠實現把mysql的數據和索引放到不一樣的磁盤下,分散io,進而提升性能,就是不像oracle那樣能夠動態的給表空間添加文件,mysql若是想要添加共享表空間的文件,須要重啓mysql服務才能生效。