一、行格式row format
什么是行格式(row_format),行格式是一种用于定义表格的存储格式的属性。它决定了表格中每一行数据的存储方式。具体来说,row_format属性定义了如何将数据行编码为磁盘上的二进制格式。不同的row_format选项可以影响表格的存储效率、空间利用率以及对数据的访问性能。
在MySQL数据库中,常见的是DYNAMIC(默认5.7及以上都是该存储格式)。
其他格式有:
COMPACT:COMPACT 格式提供了一种平衡存储空间和性能的方式。它通过使用可变长度编码和存储NULL值来减小数据行的存储空间。
REDUNDANT:REDUNANT格式使用了更多的额外信息,以提供更好的数据恢复能力。这个格式可能会占用更多的磁盘空间,但在某些情况下,它可以更容易地恢复损坏的数据。
DYNAMIC:目前MySQL5.7,8.0以后默认为该格式。它允许更多的灵活性,特别是在处理大文本和二进制数据时。它使用可变长度编码,类似于COMPACT,但对于大数据列,可以更有效地处理。
COMPRESSED:格式使用了数据压缩来减小磁盘空间占用。这个格式适用于对存储空间要求非常高的情况。但需要注意,数据压缩会对写入和读取数据产生一些性能影响。
在创建表时,可以自己设定使用特定的行格式
CREATE TABLE XXX (
...
) ENGING=INNODB ROW_FORMAT=DYNAMIC
二、字符集
MySQL默认字符集一般为latin1,不同版本字符集会有差异(MySQL5.7默认为utf8,MySQL8.0中默认为utf8mb4)
mysql> show variables like 'character_set_server';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| character_set_server | latin1 |
+----------------------+--------+
1 row in set (0.06 sec)
支持的字符集如下:
mysql> SHOW CHARACTER SET;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)
重点关注utf8和utf8mb4。
utf8和uft8mb4都支持中文(一个中文字占3字节)存储。以上两个字符集区别在于
uft8最大字符长度为3字节,utf8mb4最大支持到4字节。utf8mb4支持表情存储(而一个表情就刚好占用4字节😊)
三、索引前缀长度
什么是索引前缀长度。
索引前缀长度是指在为一个列创建索引时,只索引该列值的前几个字符或字节,而不是整个列值。这个前缀长度通常以字符或字节为单位来衡量,用于减小索引的大小和提高查询性能。
因此在创建表过程中,如果是对varchar类型字段建立索引,需要注意了
前提是在innodb引擎中。
行格式为 COMPAT类型时,索引前缀长度不能超过765字节。在utf8格式下 765 / 3 = 255。如果是utf8mb4 765 / 4 = 191。
行格式为 Dymanic,索引长度不能超过3072字节,因此字符集为utf8格式下 3072 / 3 = 1024。如果是utf8mb4 3072 / 4 = 768。
查询行格式sql语句:
mysql> show table status like 'sls_320_execute'\G;
*************************** 1. row ***************************
Name: sls_320_execute
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 75584
Avg_row_length: 479
Data_length: 36225024
Max_data_length: 0
Index_length: 7356416
Data_free: 125829120
Auto_increment: NULL
Create_time: 2023-09-06 02:00:59
Update_time: 2023-10-09 01:30:51
Check_time: NULL
Collation: utf8mb4_bin
Checksum: NULL
Create_options: row_format=DYNAMIC
Comment: ??????
1 row in set (0.00 sec)
ERROR:
No query specified