MySQL之最
最大和最小
- 一個表裏最多可有1017列(在MySQL 5.6.9 之前最大支持1000列)。虛擬列也受限這個限製。
- 一個表最多可以有64個二級索引。
- 如果innodb_large_prefix打開,在InnoDB表DYNAMIC或COMPRESSED列格式下,索引前綴最大支持前3072字節;如果不打開的話,在任意列格式下,最多支持前767字節。 這個限製既適用於前綴索引也適用於全列索引。
- 基於一個16KB的頁最多裝3072個字節,如果你把InnoDB 的page 大小從8KB降到4KB,索引的長度也相應的降低。也就是說,當頁是8KB的時候最大索引長度是1536字節;當頁大小是4KB的時候最大索引長度是768字節;
- 聯合索引最多支持16列,如果超過這個限製就會遇到以下錯誤:
ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
- 行長度(除去可變長類型:VARBINARY/VARCHAR/BLOB/TEXT),要小於頁長(如4KB, 8KB, 16KB, and 32KB)的一半。 例如:innodb_page_size 長度是16KB的話,行長不超過8KB;如果innodb_page_size 是64KB的話,行長不超過16KB; LONGBLOB/LONGTEXT/BLOB/TEXT列必須小於4GB,整個行長也必須小於4GB。 如果一行小於一頁的一半,它可以存在一個page裏麵。如果超過了頁的一半,就會把可變長列放到額外的頁存(如果對這個感興趣的話可以看看, MySQL頁管理)。
- 雖然InnoDB內部支持行長大於65,535字節,但是MySQL限製了所有列的組合長度(如果對這個感興趣的話可以看看, 表的列大小和行長)。 例如:
mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000), -> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), -> f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB; ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change somecolumns to TEXT or BLOBs
- 在一些老操作係統中,文件必須小於2GB。這並非是InnoDB本身的限製,如果你需要大的表空間,就要配置使用幾個小的數據文件而不是一個大的數據文件。
- InnoDB日誌文件組合大小最大可以是512GB。
- 最小的表空間是10MB,最大的表空間取決於InnoDB頁大小(最大表空間也就是最大表大小)。 InnoDB表空間大小 InnoDB頁大小 | 最大表空間 ------- | ------- 4KB | 16TB 8KB | 32TB 16KB | 64TB 32KB | 128TB 64KB | 256TB 默認InnoDB頁大小是16KB,你可以在創建一個實例的時候,修改配置文件裏麵這個innodb_page_size來提高或降低頁大小。 在 Barracuda文件格式下,ROW_FORMAT=COMPRESSED最大支持page_size 16KB。
除了ROW_FORMAT=COMPRESSED最大page size隻能是16KB以外,可以配置page size是32KB或者64KB。當page size是32KB或者64KB的時候,最大記錄長度是16KB。當 innodb_page_size=32k時,擴展長度是2MB;當 innodb_page_size=64k時,擴展長度是4MB。
一個MySQL實例隻能指定1個innodb_page_size,而不能根據數據文件或者日誌文件定製這些文件的innodb_page_size。
表和事務
- 如果innodb_table_locks=1的話,lock tables需要在每個表上加兩把鎖。除了在MySQL Server層的表鎖,還需要再InnoDB層也加鎖。在MySQL 4.1.2之前的版本,不需要InnoDB層的表鎖;可以通過設置innodb_table_locks=0選擇老的表設定方式。如果沒有獲取InnoDB層的表鎖,即使某些記錄被其他事務鎖定,lock tables也可以完成。 在MySQL 5.7,innodb_table_locks=0 就會對lock tables ... write顯示鎖定不起作用。但是通過 lock tables ... writes加隱式鎖(比如:觸發器) 或者 lock tables ... read加鎖,對讀或寫確實有作用。 2.所有的InnoDB鎖都被事務持有,當這個事務已經提交或者回滾的時候,InnoDB的鎖就會被釋放。所以,在autocommit=1模式下,在InnoDB表上執行lock table沒多大意義,因為獲取的InnoDB表鎖會被立即釋放。
- LOCK TABLES執行隱式commit和unlock table,所以在(鎖表)事務過程中你不能再鎖其他的表了。
- 數據修改事務的上限是96*1023個並發事務(undo記錄)。在128個回滾段中的32個都被分配給了非redo日誌(這些日誌是由修改臨時表和相關對象事務產生)。這樣就把並發修改數據事務的上限從128K降到了96K。這96K限製的是修改非臨時表的事務上限。如果所有的修改數據事務都是修改臨時表的話,上限是32K個並發事務。
參考資料:
https://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html
最後更新:2017-10-18 10:33:40