Mysql 连接ASCII和UTF-8表会增加开销吗?
使用Mysql 连接ASCII和UTF-8表会增加开销吗?,mysql,utf-8,character-encoding,ascii,query-performance,Mysql,Utf 8,Character Encoding,Ascii,Query Performance,使用字符集ascii-COLLATE ascii\u-bin可以很好地处理许多表格,这会稍微快一点。下面是一个例子: CREATE TABLE `session` ( `id` CHAR(64) NOT NULL, `created_at` INTEGER NOT NULL, `modified_at` INTEGER NOT NULL, PRIMARY KEY (`id`), CONSTRAINT FOREIGN KEY (`user_id`) REFE
字符集ascii-COLLATE ascii\u-bin
可以很好地处理许多表格,这会稍微快一点。下面是一个例子:
CREATE TABLE `session` (
`id` CHAR(64) NOT NULL,
`created_at` INTEGER NOT NULL,
`modified_at` INTEGER NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `user`(`id`)
) CHARACTER SET ascii COLLATE ascii_bin;
但如果我加入其中:
CREATE TABLE `session_value` (
`session_id` CHAR(64) NOT NULL,
`key` VARCHAR(64) NOT NULL,
`value` TEXT,
PRIMARY KEY (`session_id`, `key`),
CONSTRAINT FOREIGN KEY (`session_id`) REFERENCES `session`(`id`) ON DELETE CASCADE
) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
会发生什么?逻辑告诉我它应该是无缝的,因为ASCII是UTF-8的子集。人性告诉我,我可以期待任何东西,从核心转储到出现在我屏幕上的消息
跟随白兔。
。¯\_(ツ)_/“为什么不一直使用UTF-8?使用ASCII表通常是一个错误,这表明您忘记设置编码。使用单一编码可以大大简化您的内部架构
只有当您有CHAR
、VARCHAR
或TEXT
列时,编码才相关
如果您有一个该类型的列,那么在默认情况下将其设置为UTF8MB4
连接ASCII和UTF-8表会增加开销吗
是
如果你这样做
SELECT whatever
FROM session s
JOIN session_value v
ON s.id = v.session_id
查询引擎必须比较id
和session\u id
的许多值以满足您的查询
如果id
和session\u id
具有完全相同的数据类型,查询计划器将能够利用索引和快速比较
但是,如果它们具有不同的字符集,查询计划器必须按如下方式解释查询
... JOIN session_value v
ON CONVERT(s.id USING utf8mb4) = v.session_id
当WHERE或ON条件的形式为f(column)
时,它会使查询变得不可搜索:它会阻止索引的有效使用。这会影响查询性能
在您的情况下,在将行插入到会话\u值时,也会出现类似的性能问题:服务器必须进行转换以检查外键约束
如果这些表将投入生产,那么您最好为这些列使用相同的字符集。当您有数千行时,修复此问题要比当您有数百万行时容易得多。说真的
它确实有一个字符列。如果使用UTF-8,它将避免可能减慢查询速度的转换步骤。我不确定它是否是一个干净的子集。在同一个表中有不同的列可以是不同的字符集
和/或排序规则
。只要两个表中有“相同”的值,就可以ent表,使这些列相同;不依赖于“子集”规则。