虽然会有一些常规意义上的数据表错误设计和优秀设计原则,但是同样也会有 MySQL 特定的一些情况,这会导致我们犯一些 MySQL 特定的错误。本篇讨论常见的设计误区。
误区一:过多的数据列
MySQL 存储引擎的 API 是按照行缓冲区方式从服务端和存储引擎复制数据。服务端将缓冲区数据解码成数据列。然而,将行缓冲区的格式转换为数据行数据结构的列可能会代价很高。MyISAM 固定使用与服务端匹配的行格式,因此无需转换。然而,MyISAM 的可变行格式以及 InnoDB 的行格式总是需要进行转换。转换的代价依赖于列的数量。如果当数据表的列超过上百列的时候,会引起很高的 CPU 资源消耗——即便是使用到的列很少。曾经看过一篇文章,指的是一个多语言的解决方案,直接简单粗暴地将系统支持的语言用对应的列表示,例如:
CREATE TABLE t_multi_language_news (
id INT PRIMARY KEY,
title_cn VARCHAR(32),
title_en VARCHAR(32),
title_it VARCHAR(32),
...
content_cn VARVHAR(256),
content_en VARCHAR(256