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表,使这些列相同;不依赖于“子集”规则。