目前,我正在使用VARCHAR
/ TEXT
和utf8_general_ci
来处理mysql中的所有字符列。现在我想改进数据库布局/性能。
到目前为止我想到的是更好地使用
CHAR
代替VARCHAR
作为GUID或会话ID CHAR
由于处理问题,我不想将我的GUID保存为BINARY(16)
,因此我宁愿将它们保存为CHAR(32)
以特别改进密钥。 (当从utf8切换到某个1字节字符集时,我甚至会保存2/3)
在同一个mysql(innodb)表中混合使用不同的字符集是不错的做法?或者当所有列在同一个表中具有相同的字符集时,我能获得更好的性能吗?甚至数据库?
答案 0 :(得分:3)
GUID / UUID / MD5 / SHA1都是十六进制和短划线。对他们来说
CHAR(..) CHARACTER SET ascii COLLATE ascii_general_ci
在比较十六进制字符串时,这将允许A
= a
。
对于Base64内容,请使用
CHAR(..) CHARACTER SET ascii COLLATE ascii_bin
BINARY(..)
因为A
不在语义上与a
相同。
进一步说明......
BINARY
可能比任何_bin
整理快一点,但还不足以引起注意。CHAR
用于真正固定长度的列;在其他情况下使用它不会误导用户。%_bin
比%_general_ci
更快,这比其他排序规则更快。再一次,你很难衡量差异。TINYTEXT
或TINYBLOB
。utf8mb4
的情况下,请使用utf8mb4_unicode_520_ci
(如果使用版本8.0,则使用utf8mb4_900_ci
)。 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
其余的是"无用":
| 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)
更多强>
ENUM
是1个字节,但就像一个字符串。所以你得到了两个世界中最好的"。 (有弊端,ENUM
vs TINYINT
vs 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%(空间)。<强> ENUM 强>
ALTER TABLE
,但 可以&#34; inplace&#34;。'unknown'
(或类似内容)开始列表并制作列NOT NULL
(与NULL
对比)。A
与a
),否则选择无关紧要。