列数 行数 表数 限制 mysql 字段类型优化
枚举型
Creating and Using ENUM Columns
An enumeration value must be a quoted string literal. For example, you can create a table with an ENUM
column like this:
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),
('polo shirt','small');
SELECT name, size FROM shirts WHERE size = 'medium';
+---------+--------+
| name | size |
+---------+--------+
| t-shirt | medium |
+---------+--------+
UPDATE shirts SET size = 'small' WHERE size = 'large';
COMMIT;
Inserting 1 million rows into this table with a value of 'medium'
would require 1 million bytes of storage, as opposed to 6 million bytes if you stored the actual string 'medium'
in a VARCHAR
column.
1字节 6字节
MySQL :: MySQL 8.0 Reference Manual :: 11.3.5 The ENUM Type https://dev.mysql.com/doc/refman/8.0/en/enum.html
Index Values for Enumeration Literals
Each enumeration value has an index:
-
The elements listed in the column specification are assigned index numbers, beginning with 1.
-
The index value of the empty string error value is 0. This means that you can use the following
SELECT
statement to find rows into which invalidENUM
values were assigned:mysql> SELECT * FROM tbl_name WHERE enum_col=0;
-
The index of the
NULL
value isNULL
. -
The term “index” here refers to a position within the list of enumeration values. It has nothing to do with table indexes.
For example, a column specified as ENUM('Mercury', 'Venus', 'Earth')
can have any of the values shown here. The index of each value is also shown.
Value | Index |
---|---|
NULL |
NULL |
'' |
0 |
'Mercury' |
1 |
'Venus' |
2 |
'Earth' |
3 |
An ENUM
column can have a maximum of 65,535 distinct elements.
If you retrieve an ENUM
value in a numeric context, the column value's index is returned. For example, you can retrieve numeric values from an ENUM
column like this:
mysql> SELECT enum_col+0 FROM tbl_name;
Functions such as SUM()
or AVG()
that expect a numeric argument cast the argument to a number if necessary. For ENUM
values, the index number is used in the calculation.
获取无效的枚举类型。
MySQL :: MySQL 8.0 Reference Manual :: C.10.4 Limits on Table Column Count and Row Size https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html
C.10.4 Limits on Table Column Count and Row Size
MySQL has hard limit of 4096 columns per table, but the effective maximum may be less for a given table. The exact column limit depends on several factors:
-
The maximum row size for a table constrains the number (and possibly size) of columns because the total length of all columns cannot exceed this size. SeeRow Size Limits.
-
The storage requirements of individual columns constrain the number of columns that fit within a given maximum row size. Storage requirements for some data types depend on factors such as storage engine, storage format, and character set. See Section 11.8, “Data Type Storage Requirements”.
-
Storage engines may impose additional restrictions that limit table column count. For example,
InnoDB
has a limit of 1017 columns per table. SeeSection 15.6.1.7, “Limits on InnoDB Tables”. For information about other storage engines, see Chapter 16, Alternative Storage Engines. -
Functional key parts (see Section 13.1.15, “CREATE INDEX Syntax”) are implemented as hidden virtual generated stored columns, so each functional key part in a table index counts against the table total column limit.
The maximum row size for a given table is determined by several factors:
-
The internal representation of a MySQL table has a maximum row size limit of 65,535 bytes, even if the storage engine is capable of supporting larger rows.
BLOB
andTEXT
columns only contribute 9 to 12 bytes toward the row size limit because their contents are stored separately from the rest of the row. -
The maximum row size for an
InnoDB
table, which applies to data stored locally within a database page, is slightly less than half a page for 4KB, 8KB, 16KB, and 32KBinnodb_page_size
settings. For example, the maximum row size is slightly less than 8KB for the default 16KBInnoDB
page size. For 64KB pages, the maximum row size is slightly less than 16KB. See Section 15.6.1.7, “Limits on InnoDB Tables”.If a row containing variable-length columns exceeds the
InnoDB
maximum row size,InnoDB
selects variable-length columns for external off-page storage until the row fits within theInnoDB
row size limit. The amount of data stored locally for variable-length columns that are stored off-page differs by row format. For more information, see Section 15.10, “InnoDB Row Storage and Row Formats”. -
Different storage formats use different amounts of page header and trailer data, which affects the amount of storage available for rows.
-
For information about
InnoDB
row formats, see Section 15.10, “InnoDB Row Storage and Row Formats”, and Section 15.6.1.2, “The Physical Row Structure of an InnoDB Table”. -
For information about
MyISAM
storage formats, see Section 16.2.3, “MyISAM Table Storage Formats”.
-
Row Size Limit Examples
-
The MySQL maximum row size limit of 65,535 bytes is demonstrated in the following
InnoDB
andMyISAM
examples. The limit is enforced regardless of storage engine, even though the storage engine may be capable of supporting larger rows.mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1; ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g VARCHAR(6000)) ENGINE=MyISAM CHARACTER SET latin1; ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
In the following
MyISAM
example, changing a column toTEXT
avoids the 65,535-byte row size limit and permits the operation to succeed becauseBLOB
andTEXT
columns only contribute 9 to 12 bytes toward the row size.mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g TEXT(6000)) ENGINE=MyISAM CHARACTER SET latin1; Query OK, 0 rows affected (0.02 sec)
The operation succeeds for an
InnoDB
table because changing a column toTEXT
avoids the MySQL 65,535-byte row size limit, andInnoDB
off-page storage of variable-length columns avoids theInnoDB
row size limit.mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g TEXT(6000)) ENGINE=InnoDB CHARACTER SET latin1; Query OK, 0 rows affected (0.02 sec)
-
Storage for variable-length columns includes length bytes, which are counted toward the row size. For example, a
VARCHAR(255) CHARACTER SET utf8mb3
column takes two bytes to store the length of the value, so each value can take up to 767 bytes.The statement to create table
t1
succeeds because the columns require 32,765 + 2 bytes and 32,766 + 2 bytes, which falls within the maximum row size of 65,535 bytes:mysql> CREATE TABLE t1 (c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL) ENGINE = InnoDB CHARACTER SET latin1; Query OK, 0 rows affected (0.02 sec)
The statement to create table
t2
fails because, although the column length is within the maximum length of 65,535 bytes, two additional bytes are required to record the length, which causes the row size to exceed 65,535 bytes:mysql> CREATE TABLE t2 (c1 VARCHAR(65535) NOT NULL) ENGINE = InnoDB CHARACTER SET latin1; ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
Reducing the column length to 65,533 or less permits the statement to succeed.
mysql> CREATE TABLE t2 (c1 VARCHAR(65533) NOT NULL) ENGINE = InnoDB CHARACTER SET latin1; Query OK, 0 rows affected (0.01 sec)
-
For
MyISAM
tables,NULL
columns require additional space in the row to record whether their values areNULL
. EachNULL
column takes one bit extra, rounded up to the nearest byte.The statement to create table
t3
fails becauseMyISAM
requires space forNULL
columns in addition to the space required for variable-length column length bytes, causing the row size to exceed 65,535 bytes:mysql> CREATE TABLE t3 (c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL) ENGINE = MyISAM CHARACTER SET latin1; ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
For information about
InnoDB
NULL
column storage, see Section 15.6.1.2, “The Physical Row Structure of an InnoDB Table”. -
InnoDB
restricts row size (for data stored locally within the database page) to slightly less than half a database page for 4KB, 8KB, 16KB, and 32KBinnodb_page_size
settings, and to slightly less than 16KB for 64KB pages.The statement to create table
t4
fails because the defined columns exceed the row size limit for a 16KBInnoDB
page.mysql> CREATE TABLE t4 ( c1 CHAR(255),c2 CHAR(255),c3 CHAR(255), c4 CHAR(255),c5 CHAR(255),c6 CHAR(255), c7 CHAR(255),c8 CHAR(255),c9 CHAR(255), c10 CHAR(255),c11 CHAR(255),c12 CHAR(255), c13 CHAR(255),c14 CHAR(255),c15 CHAR(255), c16 CHAR(255),c17 CHAR(255),c18 CHAR(255), c19 CHAR(255),c20 CHAR(255),c21 CHAR(255), c22 CHAR(255),c23 CHAR(255),c24 CHAR(255), c25 CHAR(255),c26 CHAR(255),c27 CHAR(255), c28 CHAR(255),c29 CHAR(255),c30 CHAR(255), c31 CHAR(255),c32 CHAR(255),c33 CHAR(255) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET latin1; ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
-
MySQL :: MySQL 8.0 Reference Manual :: C.10.2 Limits on Number of Databases and Tables https://dev.mysql.com/doc/refman/8.0/en/database-count-limit.html
C.10.2 Limits on Number of Databases and Tables
MySQL has no limit on the number of databases. The underlying file system may have a limit on the number of directories.
MySQL has no limit on the number of tables. The underlying file system may have a limit on the number of files that represent tables. Individual storage engines may impose engine-specific constraints. InnoDB
permits up to 4 billion tables.
MySQL :: MySQL 8.0 Reference Manual :: C.10.3 Limits on Table Size https://dev.mysql.com/doc/refman/8.0/en/table-size-limit.html
C.10.3 Limits on Table Size
The effective maximum table size for MySQL databases is usually determined by operating system constraints on file sizes, not by MySQL internal limits. For up-to-date information operating system file size limits, refer to the documentation specific to your operating system.
Windows users, please note that FAT and VFAT (FAT32) are not considered suitable for production use with MySQL. Use NTFS instead.
If you encounter a full-table error, there are several reasons why it might have occurred:
-
The disk might be full.
-
You are using
InnoDB
tables and have run out of room in anInnoDB
tablespace file. The maximum tablespace size is also the maximum size for a table. For tablespace size limits, see Section 15.6.1.7, “Limits on InnoDB Tables”.Generally, partitioning of tables into multiple tablespace files is recommended for tables larger than 1TB in size.
-
You have hit an operating system file size limit. For example, you are using
MyISAM
tables on an operating system that supports files only up to 2GB in size and you have hit this limit for the data file or index file. -
You are using a
MyISAM
table and the space required for the table exceeds what is permitted by the internal pointer size.MyISAM
permits data and index files to grow up to 256TB by default, but this limit can be changed up to the maximum permissible size of 65,536TB (2567 − 1 bytes).If you need a
MyISAM
table that is larger than the default limit and your operating system supports large files, theCREATE TABLE
statement supportsAVG_ROW_LENGTH
andMAX_ROWS
options. See Section 13.1.20, “CREATE TABLE Syntax”. The server uses these options to determine how large a table to permit.If the pointer size is too small for an existing table, you can change the options with
ALTER TABLE
to increase a table's maximum permissible size. See Section 13.1.9, “ALTER TABLE Syntax”.ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
You have to specify
AVG_ROW_LENGTH
only for tables withBLOB
orTEXT
columns; in this case, MySQL can't optimize the space required based only on the number of rows.To change the default size limit for
MyISAM
tables, set themyisam_data_pointer_size
, which sets the number of bytes used for internal row pointers. The value is used to set the pointer size for new tables if you do not specify theMAX_ROWS
option. The value ofmyisam_data_pointer_size
can be from 2 to 7. A value of 4 permits tables up to 4GB; a value of 6 permits tables up to 256TB.You can check the maximum data and index sizes by using this statement:
SHOW TABLE STATUS FROM db_name LIKE 'tbl_name';
You also can use myisamchk -dv /path/to/table-index-file. See Section 13.7.6, “SHOW Syntax”, or Section 4.6.4, “myisamchk — MyISAM Table-Maintenance Utility”.
Other ways to work around file-size limits for
MyISAM
tables are as follows:-
If your large table is read only, you can use myisampack to compress it. myisampack usually compresses a table by at least 50%, so you can have, in effect, much bigger tables. myisampack also can merge multiple tables into a single table. See Section 4.6.6, “myisampack — Generate Compressed, Read-Only MyISAM Tables”.
-
MySQL includes a
MERGE
library that enables you to handle a collection ofMyISAM
tables that have identical structure as a singleMERGE
table. See Section 16.7, “The MERGE Storage Engine”.
-
-
You are using the
MEMORY
(HEAP
) storage engine; in this case you need to increase the value of themax_heap_table_size
system variable. See Section 5.1.8, “Server System Variables”.
最大行数
如果主键为整数id,则受限于
MySQL :: MySQL 8.0 Reference Manual :: 11.2.1 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
Table 11.1 Required Storage and Range for Integer Types Supported by MySQL
Type | Storage (Bytes) | Minimum Value Signed | Minimum Value Unsigned | Maximum Value Signed | Maximum Value Unsigned |
---|---|---|---|---|---|
TINYINT |
1 | -128 |
0 |
127 |
255 |
SMALLINT |
2 | -32768 |
0 |
32767 |
65535 |
MEDIUMINT |
3 | -8388608 |
0 |
8388607 |
16777215 |
INT |
4 | -2147483648 |
0 |
2147483647 |
4294967295 |
BIGINT |
8 | -263 |
0 |
263-1 |
264-1 |
字段类型
CREATE TABLE `testtab` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000000000 DEFAULT CHARSET=utf8;
2**(1*8)= 256
2**(2*8)= 65536
2**(3*8)= 16777216
2**(4*8)= 4294967296
2**(8*8)= 18446744073709551616
0、可存储的数据范围确定,基于8byte,2**32,和是否有正负符号有关;
1、当设置填充0时
1、1自动转换为无符号型;
If you specify ZEROFILL
for a numeric column, MySQL automatically adds the UNSIGNED
attribute to the column.
1、
int(2) int(11) 为 最小显示宽度;
【数值位数未达到设置的显示宽度时,会在数值前面补充零直到满足设定的显示宽度,为什么会有无符号的限制呢,是因为ZEROFILL属性会隐式地将数值转为无符号型,因此不能存储负的数值。】
「MYSQL」MYSQL中的int(11)到底代表什么意思? - Jchermy的前端之路 - SegmentFault 思否 https://segmentfault.com/a/1190000012479448