MySQL小知识

一、行格式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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容