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/DIR
InnoDB所有共享表空間資料檔案的目錄路徑。預設值為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提供了所謂的嚴格模式。嚴格模式中,前述的問題一旦出現将會導緻InnoDB産生一個錯誤,而非警告和一系列特定的處理操作。此參數則正是用于定義是否啟用InnoDB的嚴格模式,預設為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)記憶體配置設定器。預設值為ON。
innodb_version=STRING
InnoDB存儲引擎的版本号,隻讀變量。
innodb_write_io_threads={1 .. 64}
設定InnoDB用于完成寫操作的I/O線程數量,預設為4個。
附:InnoDB的資料字典指的是跟蹤InnoDB相關的對象如表、索引或表中的字段等的中繼資料資訊,這些中繼資料存儲在InnoDB的系統表空間中(system tablespace)。曆史地原因,它跟.frm檔案中的某些資料有重疊的地方。
本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1903286,如需轉載請自行聯系原作者