我有一个utf8
包含 > 80M 记录的表,其中一列 ( char(6) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
) 可以只包含拉丁符号 ( [a-zA-Z0-9]
)。将此列转换为latin1是否有意义?
MySQL文档说:
要使用 UTF-8 节省空间,请使用 VARCHAR 而不是 CHAR。否则,MySQL 必须为 CHAR CHARACTER SET utf8 列中的每个字符保留三个字节,因为这是最大可能的字符长度。例如,MySQL 必须为 CHAR(10) CHARACTER SET utf8 列保留 30 个字节。
我做了一个测试 - 创建了 2 个具有相同 50M 记录的表:
CREATE TABLE `t_utf8` (
`c_1` char(6) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
UNIQUE KEY `index_t_utf8_on_c_1` (`c_1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
CREATE TABLE `t_lat` (
`c_1` char(6) CHARACTER SET …
Run Code Online (Sandbox Code Playgroud) 我对数据库进行基准测试以找出最适合我的项目的数据库,我发现这count(*)
在 PostgeSQL 中非常慢。我不明白这是 PostgeSQL 的正常行为还是我做错了什么。
我有一个包含 ~200M 记录的表。MySQL表定义:
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
t2_id int(11) NOT NULL,
....
PRIMARY KEY (id),
KEY index_t2 (t2_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
请求(返回~30M):
SELECT COUNT(*) FROM t1 WHERE t2_id = 7;
Run Code Online (Sandbox Code Playgroud)
运行:
25,797ms
MySQL (v5.7.11)
1,222,168ms
PostgeSQL (v9.5)
解释:
MySQL:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
partitions: NULL
type: ref
possible_keys: index_t2
key: index_t2
key_len: 4
ref: const
rows: 59438630
filtered: 100.00
Extra: Using …
Run Code Online (Sandbox Code Playgroud)