目前我使用VARCHAR/ TEXT与utf8_general_ci在MySQL中的所有字符列。现在,我想改善数据库的布局/性能。
我到目前为止发现的是更好地使用
CHAR而不是将VARCHAR固定长度的列用作GUID或会话IDCHAR用于长度为1或2的小列吗?由于我不想像BINARY(16)处理问题那样广泛地保存我的GUID,所以我宁愿保存它们CHAR(32)来特别改进键。(从utf8切换到某些1字节字符集时,我什至会节省2/3)
在同一个mysql(innodb)表中混合使用不同的字符集是一种好习惯吗?还是当同一表中的所有列都具有相同的字符集时,我可以获得更好的性能吗?甚至是数据库?
GUID / UUID / MD5 / SHA1均为十六进制和破折号。对于他们
CHAR(..) CHARACTER SET ascii COLLATE ascii_general_ci
Run Code Online (Sandbox Code Playgroud)
比较十六进制字符串时,这将允许A= a。
对于Base64,请使用以下任一方法
CHAR(..) CHARACTER SET ascii COLLATE ascii_bin
BINARY(..)
Run Code Online (Sandbox Code Playgroud)
因为A是不是语义上是一样的a。
进一步说明...
BINARY可能比任何_bin排序规则都快一点,但不足以引起注意。CHAR的是真正的固定长度列; 不要在其他情况下使用它来误导用户。%_bin比%_general_ci快,比其他归类快。同样,您将很难衡量差异。TINYTEXT或TINYBLOB。utf8mb4,如果使用utf8mb4_unicode_520_ci(或utf8mb4_900_ci使用8.0版)。520和900是指Unicode标准。将来可能会出现新的归类。如果您完全是捷克人,请考虑这些字符集和排序规则。我按优先顺序列出了它们:
mysql> show collation like '%czech%';
+------------------+---------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+------------------+---------+-----+---------+----------+---------+
| utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 | -- opens up the world
| utf8_czech_ci | utf8 | 202 | | Yes | 8 | -- opens up most of the world
| latin2_czech_cs | latin2 | 2 | | Yes | 4 | -- kinda like latin1
Run Code Online (Sandbox Code Playgroud)
其余的都是“无用的”:
| cp1250_czech_cs | cp1250 | 34 | | Yes | 2 |
| ucs2_czech_ci | ucs2 | 138 | | Yes | 8 |
| utf16_czech_ci | utf16 | 111 | | Yes | 8 |
| utf32_czech_ci | utf32 | 170 | | Yes | 8 |
+------------------+---------+-----+---------+----------+---------+
7 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
更多
ENUM是1个字节,却像一个字符串。因此,您获得了“两全其美”。(存在弊端,ENUM反对者TINYINT与反对者之间存在一场“宗教战争” VARCHAR。)country_code始终为2个字母,始终为ascii,始终可以受益于不区分大小写的排序规则。所以CHAR(2) CHARACTER SET ascii COLLATE ascii_general_ci是最优的。如果您的东西有时是1个字符,有时是2个字符,则掷硬币。不管你做什么都不会有太大改变。VARCHAR(最多255个)附加了1个字节的长度。因此,如果您的琴弦的长度完全不同,VARCHAR则至少与一样好CHAR。因此简化您的大脑处理过程:“可变长度->`VARCHAR”。BIT,取决于版本,可以实现为1个字节TINYINT UNSIGNED。如果表中只有几位,那就不用担心了。CREATE TABLE。我经常看到带有BIGINT和DOUBLE(每个8字节)的表可以轻松使用较小的列。有时节省超过50%(空间)。枚举
ALTER TABLE,则不切实际-require ,尽管它可以是“就地”的。'unknown'(或类似名称)开头列表,然后创建列NOT NULL(与之相对NULL)。Avs a),否则选择关系不大。| 归档时间: |
|
| 查看次数: |
759 次 |
| 最近记录: |