MySQL 5.5 伺服器變數詳解(二)

來源:互聯網
上載者:User

innodb_adaptive_flushing={ON|OFF}

設定是否允許MySQL伺服器根據工作負載動態調整刷寫InnoDB buffer pool中的髒頁的速率。動態調整刷寫速率的目的在於避免出現IO活動尖峰。預設值為ON。作用範圍為全域層級,可用於選項檔案,屬動態變數。  innodb_adaptive_hash_index={ON|OFF}設定是否啟用InnoDB的自適應hash索引。基準測試結果顯示,自適應hash索引並非對所有工作負載都有益,因此需要根據實際應用情境的測試結果選擇更合適的值。此特性預設已啟用,可以通過命令列選項--skip-innodb_adaptive_hash_index將其禁用。作用範圍是全域,可用於選項檔案,屬動態變數。  innodb_additional_mem_pool_size={2097152 .. 4294967295}設定innodb儲存引擎為了儲存資料字典和其它內部資料結構的內在池大小,單位是位元組。表的個數越多,此參數的值就應該設定的越大;當InnoDB用完此記憶體池的空間,它就會向作業系統申請記憶體空間,並將向錯誤記錄檔記錄警告資訊。預設大小是8MB。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_autoextend_increment={1 .. 1000}當共用資料表空間沒有多餘的儲存空間時,如果其允許自動成長,此變數可用於設定其單次增長的空間大小,單位是MB,預設值是8。設定了變數innodb_file_per_table的值為1時InnoDB會為每張表使用一個單獨的資料表空間檔案,而innodb_autoextend_increment變數不會對此種資料表空間產生影響。作用範圍為全域層級,可用於選項檔案,屬動態變數。  innodb_autoinc_lock_mode={0|1|2}設定用於產生“自動成長(auto_increment欄位)”值的鎖模型。其可接受的值有0、1和2,分別用於表示"traditional"、"consecutive"和"interleaved"鎖模型。預設值為1。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_buffer_pool_instances=#設定將InnoDB的buffer pool分隔為多少個地區。對於有著數GB空間的buffer pool來說,將其分隔為多個地區可以降低不同的線程對快取頁面面的讀寫操作時資源爭用係數,進行增強其並發能力。在buffer pool中,讀取或存入頁面時所選擇的地區是基於hash演算法隨機進行的。每個buffer pool管理自己的空閑列表、列表刷寫、LRU以及其它跟buffer pool相關的資料結構,並通過各自的互斥鎖進行保護。此變數僅在變數innodb_buffer_pool_size的值大於1G時才能發揮功用,緩衝池的整體空間將由各buffer pool執行個體分割使用。出於最佳效用的目的,建議配合使用innodb_buffer_pool_instances和innodb_buffer_pool_size變數以使得每個buffer pool執行個體的都至少有1G的空間。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_buffer_pool_size=#設定InnoDB緩衝表資料和索引的記憶體緩衝區大小,單位是位元組。其預設值為128MB,最大值依賴於CPU架構。在一個較繁忙的伺服器上,當緩衝池(buffer pool)大於1G時,設定innodb_buffer_pool_instances的值大於1可提其升伸縮能力。innodb_buffer_pool_size變數的值越大,MySQL伺服器完成資料訪問時就需要越少的IO,因此,在一個有夠較大記憶體且為MySQL服務專用的伺服器上,可以將此值設定為實體記憶體的80%。但如果出現如下情況,建議縮小此變數的值:(1)實體記憶體資源緊張導致記憶體頁面換出;(2)InnoDB會為緩衝和控制結構(buffers and control structures)預留額外的記憶體,因此事實上其佔用的記憶體空間可能會比指定的數值大10%左右,這不可能超出對記憶體資源分派的預估;(3)記憶體位址空間必須連續,這在基於DLL庫使用特殊地址空間的Windows系統上可能會出現意外情況;(4)緩衝池的初始化所需要時間長度與為其指定的空間大小成正比,例如有10G緩衝池的x86_64的Linux系統上,初始化時間大約要6秒鐘。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_change_buffering=#當在表上執行INSERT、UPDATE或DELETE操作時,索引中尤其是第二索引中的資料未必按序儲存,這就可能引發隨機IO以完成第二索引的更新操作。此變數用來設定InnoDB是否啟用修改緩衝(change buffering)以及使用何種類型的修改緩衝。修改緩衝是一種最佳化方式,它能夠通過延遲寫入操作至第二索引將IO操作轉換為順序模式。其接受的值有inserts(緩衝insert操作)、deletes(緩衝delete-marking操作)、changes(緩衝insert和delete-marking操作)、purges(緩衝purge操作)、all(緩衝insert、delete-marking和purge操作)和none(不緩衝任何操作)。預設值是all。MySQL 5.5.4之前的版本只接受inserts和none兩種值。作用範圍為全域,可用於選項檔案,屬動態變數。  innodb_checksums={ON|OFF}InnoDB能夠使用校正和(checksum)來驗正從磁碟讀取的所有頁面資料的完整性,從而提高對硬體或資料檔案損壞的容錯能力。預設為啟用,然而,在少數情況下或許需要禁用這種特性,這可以通過使用--skip-innodb-checksums命令列選項實現。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_commit_concurrency={0 .. 1000}設定InnoDB可同時啟動並執行“提交”操作線程的數量。0表示無限制。此變數不能在運行時將其從“零值”修改為“非零值”,但可以從一個“非零值”修改為其它值。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_concurrency_tickets=#在一個線程進入(enter)InnoDB時,其將會擷取一定數量的“自由捲軸”(free tickets)並憑這些捲軸自由出入InnoDB(即免檢),直到其捲軸耗盡;而後的線程將被置於等待隊列中,並可能需要再次接受並發上限限制檢查。此變數則正是用於設定可同時進入InnoDB的線程並發數,即線程的“自由捲軸”數量。預設值是500。作用範圍為全域,可用於選項檔案,屬動態變數。  innodb_data_file_path=IBDATA_FILE指定InnoDB的各個資料檔案及其大小,檔案多於一個時彼此間用分號隔開。資料檔案路徑可以為相對路徑,其相對於innodb_data_home_dir變數所指向的目錄;而檔案大小的表示可以以K(KB)、M(MB)、G(GB)為單位,但這些檔案的大小之和至少要達到10MB。在沒有顯式設定innodb_data_file_path變數的情況下,MySQL伺服器會在資料目錄中自動建立一個可自動成長、初始大小為10MB的名為ibdata1的資料檔案。單個資料檔案的大小上限取決於作業系統,這意味著可以使用作業系統所支援的最大單個檔案大小以為其資料檔案的體積上限。InnoDB還支援使用裸裝置作為資料檔案。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_data_home_dir=/PATH/TO/DIRInnoDB所有共用資料表空間資料檔案的目錄路徑。預設值為MySQL的資料目錄。可以將此變數的值設定為空白,然後在innodb_data_file_path中為每個資料檔案使用絕對路徑。此變數不影響變數innodb_file_per_table啟用狀態下的每表資料表空間的資料檔案。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_doublewirte={ON|OFF}設定InnoDB是否使用雙寫緩衝。預設為啟用。InnoDB在對頁面進行部分寫入的時候使用雙寫緩衝,以防止資料損毀。雙寫緩衝是資料表空間中一個特殊的保留地區,其大小足夠在一個連續區間容納100個頁面。當InnoDB把頁面從緩衝池刷寫至磁碟時,它會先把這些頁面刷到雙寫緩衝中,然後再儲存至真正的目標位置。因此,雙寫緩衝本質上是最近寫入頁面的備份,其可確保每次寫入的原子性和可持久性。在有些情況下雙寫緩衝是不必要的,例如在從伺服器上就可以將之禁用;此外,一些檔案系統(如ZFS)自身也會實現此功能,那麼InnoDB就不用做重複的工作了。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_fast_shutdown={0|1|2}設定InnoDB關閉模式。其可接受的值中,“0”表示慢速關閉,這意味著InnoDB關閉之前會完成完全清寫(full purge)和修改緩衝合并(insert buffer merge)操作;“1”是預設值,它表示InnoDB在關閉時會跳過模式0中進行的這些操作,這也是其之所以稱作“快速關閉”的原因;“2”表示InnoDB僅刷寫日誌資訊並執行冷(cold)關閉,此時並沒有事務丟失,只是下次啟動MySQL服務時需要花費較長的時間進行故障恢複(crash recovery)。執行慢速關閉時其過程可能會持續數分鐘的時間,甚至在有些極端情況下,比如有著大量資料緩衝的情境,此過程時間長度會以小時來計。一般情況下僅在對MySQL進行主要版本升級時才需要進行慢速關閉以使得資料檔案能夠為完全適應新版本而準備妥當。通常也只能遇到緊急狀況或出於調試的目的才需要將此變數的值設定為2,以便讓處於有可能損壞風險中的資料執行最快速度的關閉。作用範圍為全域,可用於選項檔案,屬動態變數。  innodb_file_format={Antelope|Barracuda}設定建立InnoDB表的檔案格式。其可接受的參數有Antelope和Barracuda,但這僅對基於變數innodb_file_per_file的每表資料表空間檔案有影響。某些InnoDB特性如表壓縮功能僅有Barracuda檔案格式支援。作用範圍為全域,可用於選項檔案,屬動態變數。  innodb_file_format_check={ON|OFF}用於設定InnoDB是否在MySQL伺服器啟動時檢查共用資料表空間的檔案格式標籤。檢查標籤時如果其高於當前InnoDB版本所支援的能力,InnoDB就會產生錯誤並拒絕啟動;否則,對MySQL 5.5.5 及後來的版本來說InnoDB則會設定變數innodb_file_format_max的值為共用資料表空間的檔案格式標籤,而對於MySQL 5.5.5之前的版本來說,InnoDB會將共用資料表空間的檔案格式設定為變數innodb_file_format_check的值。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_file_format_max={Antelope|Barracuda}在MySQL服務啟動時,InnoDB會將變數innodb_file_format_max的值設定為共用資料表空間的檔案格式標籤(比如,Antelope或Barracuda)。如果MySQL伺服器建立或開啟了一個有著更進階格式的表,此變數的值則會被設定為那個更進階的格式。作用範圍為全域,可用於選項檔案,屬動態變數。  innodb_file_per_table={ON|OFF}設定InnoDB表是否使用每表資料表空間資料檔案(以.ibd結尾)分別儲存每個表的資料和索引。如果使用了每表資料表空間資料檔案,其將不再使用系統資料表空間(即共用資料表空間)。InnoDB表的某些特性,如壓縮表等僅對每表資料表空間生效。作用範圍為全域,可用於選項檔案,屬動態變數。  innodb_flush_log_at_trx_commit={0|1|2}設定InnoDB同步處理記錄緩衝區(log buffer)資料至記錄檔中的方式,以及刷寫記錄檔至磁碟的方式。其可接受的值中,“0”表示將日誌緩衝區每秒一次地寫入記錄檔,並同時將記錄檔刷寫至磁碟中,但事務提交時不會採取任何動作;“1”是預設值,表示在有事務提交時將日誌緩衝區寫入記錄檔,並同時將記錄檔刷寫至磁碟;“2”表示每事務提交或每秒一次將日誌緩衝區寫入記錄檔,但不會同時執行記錄檔的刷寫操作。當然,由於作業系統進程調度的原因,每秒一次的日誌寫入或刷寫操作並不能得到100%的保證。完全相容ACID的情境需要將此變數值設定為1,由於要執行每事務的日誌刷寫操作,其會阻止I/O調用,直到寫操作完成,故其會顯著降低InnoDB每秒鐘可以提交的事務數。設定為“2”可獲得比“1”更好的效能,而且僅在作業系統崩潰時才會丟失最後一秒鐘的資料,因此資料安全性也有著不錯的表現。設定為“0”則有可能會導致事務最後一秒鐘的資料丟失,於是整個事務的資料安全性將無法保證,但其通常有著最好的效能。為了在最大程式上保證複製的InnoDB事務持久性和一致性,應該設定變數innodb_flush_log_at_trx_commit=1以及設定變數sync_binlog=1。然而需要注意的是,有些磁碟自身也有緩衝,這可能會給事務操作帶來額外的潛在風險。可以使用hdparm工具或供應商的自有工具等禁用磁碟自身的緩衝。當然,高效能事務的最佳配置是把此變數的值設定為1,並且將記錄檔放在有備用電池的寫入緩衝的RAID上。作用範圍為全域,可用於選項檔案,屬動態變數。  innodb_flush_method={O_DSYNC|O_DIRECT}設定InnoDB實際與檔案系統進行互動的方式。除了寫操作之外,它還可以影響InnoDB如何讀取資料。設定innodb_flush_method變數的值為O_DSYNC時,InnoDB使用O_SYNC標誌來開啟和刷寫記錄檔,而使用fsync()來刷寫資料檔案。O_SYNC會使得所有的寫入操作都是同步的,即只有在資料被寫入磁碟之後才會返回,但不會在作業系統層面禁止緩衝,因此,它不會避免雙緩衝,並且不會直接寫入磁碟。fsync()會同時刷資料和中繼資料(而fdatasync()只刷寫資料),它比fdatasync()產生更多的IO操作,而且作業系統會緩衝一些資料在自己的緩衝中(這將導致雙緩衝)。如檔案系統可以智能地處理I/O需求,雙緩衝可能不是壞事兒,但如果MySQL設定了innodb_file_per_table變數的值為1,則會導致第個資料表空間檔案都單獨使用fsync()函數,其寫入操作就不可能會被合并了。設定innodb_flush_method變數的值為O_DIRECT時,InnoDB使用O_DIRECT標誌開啟資料檔案,而使用fsync()刷寫資料和記錄檔。O_DIRECT標誌會導致作業系統既不快取資料,也不預讀資料,它完全禁止了作業系統的緩衝並且使所有的讀寫動作直接至存放裝置,避免了雙緩衝。然而,其不能禁止硬體層面(如RAID卡)的緩衝和預讀功能,而且啟用硬體層面的緩衝和預讀功能也是保證InnoDB使用了O_DIRECT標誌時仍能保持良好效能的惟一途徑。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_force_load_corrupted={ON|OFF}設定InnoDB在啟動時是否裝載標記為“已損壞(corrupted)”的表。僅應該在troubleshooting的情境中啟用該功能以修複無法訪問的表,在troubleshooting任務完成後應該禁用此功能並重啟MySQL服務。作用範圍為全域,可用於選項檔案,屬非動態變數。  innodb_force_recovery={0|1|2|3|4|5|6}設定InnoDB的故障復原模式。InnoDB出現了“頁面損壞(page corruption)”時,通常大部分資料仍然完好,於是可以通過SELECT...INTO OUTFILE命令備份出資料以降低損失程度。然而,某些“損壞”類的故障可能會導致SELECT * FROM tbl_name命令無法執行或InnoDB後台操作崩潰,甚至會導致InnoDB的前滾操作。這種情況下,就可以使用innodb_force_recovery變數強制InnoDB儲存引擎在啟動時不執行後台操作,以便能將資料備份出來。innodb_force_recovery可接受的值中,“0”為預設值,表示執行正常啟動,即不啟用“強制修複”模式。而非零值中,某數值會包含比其小的所有數值的預防措施,然而其也較可能給B-tree索引及其它的資料結構帶來更多的損壞。故此,在此變數值為非零值時,其會阻止使用者使用INSERT、UPDATE或DELETE操作,但是會允許執行SELECT、CREATE TABLE或DROP TABLE類的操作。以下是關於其它非零值功能的說明:1(SRV_FORCE_IGNORE_CORRUPT):即使出現了頁面損壞也照常運行MySQL服務,其會在SELECT * FROM tbl_name語句執行時嘗試跳過損壞的索引記錄和頁面。2(SRV_FORCE_NO_BACKGROUND):禁止啟動主線程(master thread),其會在執行清寫(purge)操作時防止出現崩潰(crash)。3(SRV_FORCE_NO_TRX_UNDO):在故障恢複(crash recovery)後不執行事務的復原操作。4(SRV_FORCE_NO_IBUF_MERGE):禁止執行修改緩衝(insert buffer)合併作業。5(SRV_FORCE_NO_UNDO_LOG_SCAN):在啟動資料庫服務時不檢查撤消日誌(undo logs),這會導致InnoDB將未完成的事務視為已提交。6(SRV_FORCE_NO_LOG_REDO):不執行重做日誌(redo log)的前滾操作。此時,僅能執行不帶WHERE、ORDER BY或其它子句的SELECT * FROM tbl_name操作,因為複雜查詢在遇到損壞的資料結構時會中止並退出。  innodb_io_capacity=#設定InnoDB背景工作(如從緩衝池刷寫頁面或合并修改緩衝中的資料等)可執行檔I/O操作上限。其最小值為100,預設值為200,最大值取決於CPU架構。對於有著較大I/O負載的伺服器來講,應該為其指定更大的值以便能夠更好更快的執行後台維護任務。然而,在實踐中,此變數的值應該儘可能接近MySQL伺服器每秒鐘執行的I/O運算元量(即IOPS),甚至於讓其低至以不影響背景工作執行為目標的最低限度。因為,如果此值過高的話,資料會被頻繁地從緩衝中移入移出,這會降低緩衝池的在系統效能提升方面的效用。單個5400RPM或7200RPM磁碟僅能完成大約100個IOPS,因此,此種情況下應該將此變數值降低至100;而對於有著多塊磁碟或更強效能的存放裝置(如固態磁碟)的應用情境,可以按需提高此變數的值。作用範圍為全域,可用於選項檔案,屬動態變數。  innodb_large_prefix={ON|OFF}設定對於使用了DYNAMIC或COMPRESSED行格式的InnoDB表來說,是否能夠使用大於767位元組長度的索引首碼。然而,建立此種類型的表還需要設定innodb_file_format的值為barracuda,以及innodb_file_per_table的值為ture。同時,此設定對使用了REDUNDANT和COMPACT行格式的表的索引長度限定來說是不起作用的。作用範圍為全域,可用於選項檔案,屬動態變數。  innodb_lock_wait_timeout={1 .. 1073741824}設定InnoDB中某事務試圖訪問一個由其它InnoDB事務加鎖的行時其最長的等待時間,單位為秒鐘,預設值為50。在逾時情況發生時,InnoDB會返回一個1205類型的錯誤資訊,並對當前語句(非整個事務)執行復原操作;如果需要在此種情況下對整個事務進行復原,則需要在MySQL服務啟動時使用--innodb_rollback_on_timeout選項。對於OLTP系統或有著較多互動式應用的程式來說,應該降低此變數值以使得使用者較快地擷取到反饋資訊,或使得系統較塊地將此更新操作提交到隊列中以便延後處理。對於批處理應用較多的情境來說,如資料倉儲,應該增加此變數的值以等待其它較大的插入或更新操作完成。此變數僅對InnoDB的行鎖產生作用,MySQL的表鎖並非在InnoDB中實現,所以此逾時時間長度對錶鎖沒有影響。而且,由於InnoDB會能立即探測到死結的發生並會對其中的一修整務執行復原操作,因此此逾時時間長度也不應用於死結。作用範圍為全域或會話層級,可用於選項檔案,屬動態變數。  innodb_locks_unsafe_for_binlog={ON|OFF}設定InnnoDB是否在搜尋和索引掃描中使用間隙鎖(gap locking)。InnoDB使用行級鎖(row-level locking),通常情況下,InnoDB在搜尋或掃描索引的行鎖機制中使用“下一鍵鎖定(next-key locking)”演算法來鎖定某索引記錄及其前部的間隙(gap),以阻塞其它使用者緊跟在該索引記錄之前插入其它索引記錄。站在這個角度來說,行級鎖也叫索引記錄鎖(index-record lock)。預設情況下,此變數的值為OFF,意為禁止使用非安全鎖,也即啟用間隙鎖功能。將其設定為ON表示禁止鎖定索引記錄前的間隙,也即禁用間隙鎖,InnoDB僅使用索引記錄鎖(index-record lock)進行索引搜尋或掃描,不過,這並不禁止InnoDB在執行外鍵約束檢查或重複鍵檢查時使用間隙鎖。啟用innodb_locks_unsafe_for_binlog的效果類似於將MySQL的交易隔離等級設定為READ-COMMITTED,但二者並不完全等同:innodb_locks_unsafe_for_binlog是全域層級的設定且只能在服務啟動時設定,而交易隔離等級可全域設定並由會話層級繼承,然而會話層級也以按需在運行時對其進行調整。類似READ-COMMITTED交易隔離等級,啟用innodb_locks_unsafe_for_binlog也會帶來“幻影問題(phantom problem)”,但除此之外,它還能帶來如下特性:(1)對UPDATE或DELETE語句來說,InnoDB僅鎖定需要更新或刪除的行,對不能夠被WHERE條件匹配的行施加的鎖會在條件檢查後予以釋放。這可以有效地降低死結出現的機率;(2)執行UPDATE語句時,如果某行已經被其它語句鎖定,InnoDB會啟動一個“半一致性(semi-consistent)”讀操作從MySQL最近一次提交版本中獲得此行,並以之判定其是否能夠併當前UPDATE的WHERE條件所匹配。如果能夠匹配,MySQL會再次對其進行鎖定,而如果仍有其它鎖存在,則需要先等待它們退出。  innodb_log_buffer_size={262144 .. 4294967295}設定InnoDB用於輔助完成記錄檔寫操作的日誌緩衝區大小,單位是位元組,預設為8MB。較大的事務可以藉助於更大的日誌緩衝區來避免在事務完成之前將日誌緩衝區的資料寫入記錄檔,以減少I/O操作進而提升系統效能。因此,在有著較大事務的應用情境中,建議為此變數設定一個更大的值。作用範圍為全域層級,可用於選項檔案,屬非動態變數。  innodb_log_file_size={108576 .. 4294967295}設定日誌組中每個記錄檔的大小,單位是位元組,預設值是5MB。較為明智的取值範圍是從1MB到緩衝池體積的1/n,其中n表示日誌組中記錄檔的個數。記錄檔越大,在緩衝池中需要執行的檢查點刷寫操作就越少,這意味著所需的I/O操作也就越少,然而這也會導致較慢的故障恢複速度。作用範圍為全域層級,可用於選項檔案,屬非動態變數。  innodb_log_files_in_group={2 .. 100}設定日誌組中記錄檔的個數。InnoDB以迴圈的方式使用這些記錄檔。預設值為2。作用範圍為全域層級,可用於選項檔案,屬非動態變數。 innodb_log_group_home_dir=/PATH/TO/DIR設定InnoDB重做記錄檔的儲存目錄。在預設使用InnoDB日誌相關的所有變數時,其預設會在資料目錄中建立兩個大小為5MB的名為ib_logfile0和ib_logfile1的記錄檔。作用範圍為全域層級,可用於選項檔案,屬非動態變數。 innodb_max_dirty_pages_pct={0 .. 99}設定InnoDB的緩衝池中髒頁比例的上限,預設為75。當緩衝池中的髒頁比例接近或達到此變數定義的比值時,InnoDB的主線程會將刷寫部分髒頁中的資料至對應的檔案中。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_max_purge_lag={0 .. 4294967295}InnoDB事務系統會維持一個有索引記錄被添加了刪除標記(delete-marked)的事務的列表,此列表的長度即為清寫延遲(purge_lag)。此變數用於設定當發生清寫延遲時,其隊列長度達到多大時開始延遲INSERT、UPDATE或DELETE操作。當puge_lag超過innodb_max_purge_lag時,將延遲這些操作((purge_lag/innodb_max_purge_lag)*10)-5毫秒。預設值為0,表示從不延遲這些操作。需要進行操作延遲與否是在purge操作剛開始時計算的,並且每隔10秒鐘會重新計算一次。基於曆史地原因,purge操作無法啟動時是不會有任何操作延遲的情況發生。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_mirrored_log_groups=#設定日誌組鏡像的個數。其值應該為1。 innodb_old_blocks_pct={5 .. 95}InnoDB以“列表”結構管理緩衝池,並使用修改版的LRU演算法對其執行維護操作。當需要空間以儲存新塊(new block)時,InnoDB會清理最近最少使用的塊並將新塊加入到列表中。“中點插入策略(midpoint insertion policy)”將整個列表看作兩個子列表:在列表首部是那些最近被訪問過的新塊(new/young block)子列表,尾部是那些最近較少被訪問到的舊塊(lod block)子列表。而LRU演算法和中點插入策略用於保證將最近經常被訪問到的塊置於新塊子列表,InnoDB新讀入的塊將被置於舊塊子列表的前頭,並根據需要將舊塊子列表中的塊移除。而某個被再次訪問到的舊塊則會被移至新塊子列表的首部。表掃描操作可能會一次性地向緩衝池中讀入大量的資料區塊並可能導致一大批舊塊被移出。此變數正是用於設定被視作舊塊子列表的長度所佔據整個列表長度的比例,預設值是37,即緩衝池的八分之三。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_old_blocks_time=#用於設定緩衝池中舊塊子列表中的某舊塊在其第一次又被訪問到時,其至少需要在舊塊子列表中再呆上多長時間(單位為毫秒)才會被轉移至新塊子列表。預設值是0,表示立即轉移至新塊子列表,哪怕其剛剛被轉移至舊塊子列表。而非零值則明確定義舊塊列表中的塊在其第一次被訪問到時至少需要在舊塊子列表中等待轉移的時間長度。此變數通常要結合innodb_old_blocks_pct使用。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_open_files=#設定MySQL可同時開啟的.ibd資料表空間檔案的數量上限。此變數僅在使用多資料表空間檔案時生效,其最小值為10,預設值為300。此變數的限定僅應用於InnoDB表的.ibd檔案,跟MySQL伺服器選項--open-files-limit沒有關係,更不會影響表緩衝的操作。作用範圍為全域層級,可用於選項檔案,屬非動態變數。 innodb_purge_batch_size={1 .. 5000}清寫(purge)是指將緩衝池中的髒頁同步至持久性存放裝置中的操作,以重做日誌的記錄為單位。此變數則用於定義清寫操作的粒度,即多少個重做日誌記錄組合起來可以觸發一次清寫操作,預設值為20。此變數通常用於跟innodb_purge_threads=1一起對進行效能調優,但一般情境中都不需要修改它。作用範圍為全域層級,可用於選項檔案,屬非動態變數。 innodb_purge_threads={0|1}設定InnoDB執行清寫操作的線程數量。預設值為0,表示清寫操作由InnoDB的主線程自己完成,這可以降低內部資源競爭發生的機率,進而增強MySQL服務伸縮能力。不過,隨著InnoDB內部各式各樣的競爭越來越多,這種設定帶來的效能優勢已幾乎不值一提。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_read_ahead_threshold={0 .. 64}設定InnoDB預讀頁面至緩衝池時的線性預讀敏感度,也即InnoDB的讀操作至少從一個盤區(extent,包含64個頁面)中讀取多個頁面時才會為讀取整個盤區中後續的頁面初始化一個非同步讀操作。預設值為56。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_read_io_threads={1 .. 64}設定InnoDB為讀操作啟動的I/O線程數量,預設為4個。作用範圍為全域層級,可用於選項檔案,屬非動態變數。 innodb_replication_delay={0 .. 4294967295}設定在從伺服器(slave)上啟動並執行線程數達到innodb_thread_concurrency變數定義的並發上限時複製線程需要延遲的時間長度。預設為0,表示不延遲。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_rollback_on_timeout={ON|OFF}設定事務執行過程逾時時交易回復的方式。在MySQL 5.5中,預設為OFF,表示僅復原事務中的最後一個語句。如果設定為ON,則表示中止事務執行並復原整個事務。作用範圍為全域層級,可用於選項檔案,屬非動態變數。 innodb_rollback_segments={1 .. 128}設定InnoDB在系統資料表空間中為每個事務使用多少個復原段(rollback segment),預設為128個。如果較少的復原段可以提升系統效能,則應該降低此變數的值。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_spin_wait_delay={0 .. 4294967295}自旋(spin)是一種通過不間斷地測試來查看一個資源是否變為可用狀態的等待操作,用於僅需要等待很短的時間等待所需資源的情境。使用自旋這種“空閑迴圈(busy-loop)”來完成資源等待的方式要比通過環境切換使線程轉入睡眠狀態的方式要高效得多。但如果自旋了一個很短的時間後其依然無法擷取資源,則仍然會轉入前述第二種資源等待方式。此變數則正是用於定義InnoDB自旋操作的空閑迴圈轉數,預設為6轉。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_stats_method={nulls_equal|nulls_unequal|null_ignored}設定MySQL為InnoDB表收集分布的索引值的統計資料時如何處理NULL類型的資料。其可接受的值有三個,null_equals意指將所有的NULL值視為相同,並為之建立一個值組(value group)以儲存NULL類值的個數;nulls_unequal意指將所有的NULL值視為不同,並為每個NULL單獨建立一個大小為1的值組;nulls_ignored表示所有的NULL值都被忽略。這些用於產生表統計資料的方法會影響到最佳化器為執行查詢如何選擇選擇索引。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_stats_on_metadata={OFF|ON}設定使用SHOW TABLE STATUS或者SHOW INDEX這兩個中繼資料語句時,或訪問INFORMATION_SCHEMA中的TABLES或STATISTICS表時,InnoDB是否更新統計資料。預設為更新。禁用此功能可以加速訪問有著大量的表或索引的資料庫,也可能提升InnoDB表上查詢操作執行計畫(execution plan)的穩定性。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_strict_mod={ON|OFF}為防止無視SQL語句書寫或文法中的錯誤或無視操作模式與SQL語句各種組合中的有趣的錯誤提示,InnoDB提供了所謂的strict 模式。strict 模式中,前述的問題一旦出現將會導致InnoDB產生一個錯誤,而非警告和一系列特定的處理操作。此參數則正是用於定義是否啟用InnoDB的strict 模式,預設為OFF。 innodb_support_xa={TRUE|FLASE}儲存引擎事務在儲存引擎內部被賦予了ACID屬性,分布式(XA)事務是一種高層次的事務,它利用“準備”然後“提交”(prepare-then-commit)兩段式的方式將ACID屬性擴充到儲存引擎外部,甚至是資料庫外部。然而,“準備”階段會導致額外的磁碟刷寫操作。XA需要事務協調員,它會通知所有的參與者準備提交事務(階段1)。當協調員從所有參與者那裡收到“就緒”資訊時,它會指示所有參與者進行真正的“提交”操作。此變數正是用於定義InnoDB是否支援兩段式提交的分散式交易,預設為啟用。事實上,所有啟用了二進位日誌的並支援多個線程同時向二進位日誌寫入資料的MySQL伺服器都需要啟用分散式交易,否則,多個線程對二進位日誌的寫入操作可能會以與原始次序不同的方式完成,這將會在基於二進位日誌的恢複操作中或者是從伺服器上建立出不同未經處理資料的結果。因此,除了僅有一個線程可以改變資料以外的其它應用情境都不應該禁用此功能。而在僅有一個線程可以修改資料的應用中,禁用此功能是安全的並可以提升InnoDB表的效能。作用範圍為全域和會話層級,可用於選項檔案,屬動態變數。 innodb_sync_spin_loops={0 .. 4294967295}設定一個線程在等待InnoDB釋放某個互斥量(mutex)之前自旋的轉數,當自旋操作達到這個轉數但互斥量仍未被釋放時此線程將被掛起。預設值為30。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_table_locks={ON|OFF}InnoDB在儲存引擎層級支援行級鎖,而MySQL在伺服器層級還支援使用表級鎖。此變數則正是用來定義InnoDB是否在其內部支援使用MySQL表級鎖。預設值為1或ON,表示如果autocommit變數的值為0(即禁止自動認可),在InnoDB表上顯式使用LOCK TABLES語句將使得InnoDB在儲存引擎內部鎖定此表。使用0或OFF值,則意味著顯式使用LOCKS TABLE...WRITE語句不會在儲存引擎層級產生影響,但對其它顯式使用的LOCK TABLES...WRITE或LOCK TABLES...READ語句依然會有影響。作用範圍為全域和會話層級,可用於選項檔案,屬動態變數。 innodb_thread_concurrency={0...1000}設定InnoDB可在其內部並發啟動並執行作業系統線程數量上限。多出的線程將被放置於FIFO隊列進行等待,且不被計入並發運行線程數量。對於不用的應用情境來說,其理想的取值取決於硬體環境和工作負載,一般推薦為CPU個數的2倍加上磁碟的個數。預設值為0,表示無上限(不檢查並發數量),這意味著InnoDB可以按需要使用任意數量的並發線程,並會禁用SHOW ENGINE INNODB STATUS中的queries inside InnoDB和queries in queue counters兩個計數器。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_thread_sleep_delay=#設定InnoDB線程在加入InnoDB隊列之前的睡眠時間長度,單位是毫秒,預設值為10000。0值表示禁止睡眠而直接排入佇列。作用範圍為全域層級,可用於選項檔案,屬動態變數。 innodb_use_native_aio={ON|OFF}設定InnoDB是否使用Linux的非同步I/O子系統,因此,其僅應用於Linux系統平台,且MySQL啟動後不能更改其值。InnoDB預設會啟用此功能,而InnoDB如果因為Linux的非同步I/O子系統的問題而無法正常啟動,可以在選項檔案中將此變數設定為OFF並重新啟動之。事實上,就算變數值為ON,如果MySQL服務啟動探測到了潛在的問題如聯合的臨時目錄路徑、tmpfs檔案系統以及Linux核心不支援在tmpfs上使用AIO機制時也會自動關閉此變數。作用範圍為全域層級,可用於選項檔案,屬非動態變數。 innodb_use_sys_malloc={ON|OFF}設定InnoDB使用作業系統的(ON)還是自有的(OFF)記憶體 Clerk。預設值為ON。 innodb_version=STRINGInnoDB儲存引擎的版本號碼,唯讀變數。 innodb_write_io_threads={1 .. 64}設定InnoDB用於完成寫操作的I/O線程數量,預設為4個。  附:InnoDB的資料字典指的是跟蹤InnoDB相關的對象如表、索引或表中的欄位等的中繼資料資訊,這些中繼資料存放區在InnoDB的系統資料表空間中(system tablespace)。曆史地原因,它跟.frm檔案中的某些資料有重疊的地方。  參考連結 http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html 作者原創,開來源文件。理解或有不當之處,歡迎討論, 群號:279599283。轉載請務必保留此連結,http://mageedu.blog.51cto.com。 

本文出自 “馬哥教育” 部落格,請務必保留此出處http://mageedu.blog.51cto.com/4265610/1062628

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.