我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 常见的数据表设计误区汇总

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 常见的数据表设计误区汇总

目录
  • 误区一:过多的数据列
  • 误区二:过多的联合查询
  • 误区三:滥用 SET替代 ENUM
  • 误区四:生硬地避免NULL
  • 误区五:使用整数替换时间戳
  • 误区六:忘记字段的最大存储范围
  • 结语:

误区一:过多的数据列

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),
  conntent_it VARCHAR(256),
);

这种方式随着系统支持的语言越多,数据表的列越多,最终导致性能严重下降。如果你设计一个数据表的列数量超过100时,就需要考虑你的设计是否合理了。 **应对方式:**首先是考虑业务本身的设计是否合理,如果确实一个实体需要很多字段来描述,那么可以拆分数据表,通过扩展信息表来做。举个例子,对于资讯类的数据表,因为内容一般占据的空间会比较大,但是在列表不会直接查看,就可以拆成资讯主表和资讯详情表,主表存储标题、时间、摘要、缩略图附件 id 等列表要查看的信息即可。而资讯详情可以存储资讯的内容、来源、原文链接等信息。

误区二:过多的联合查询

MySQL 一次联合查询最多只能61张表。而有些设计主张不做冗余字段设计,这会导致复杂业务时需要连接多张表查询。即便是联合的表数量低于61个,也会引起性能的下降,而且整个 SQL 语句的维护将变得十分困难。作为一个设计的首要原则,就是如果想追求速度的话,一次查询不要跨太多的数据表做联合查询,尤其面临高并发场景的时候。 **应对方式:**首先,对于确定不会改变的字段,可以考虑冗余字段的方式减少联合查询。例如,一家企业的所属省份信息,就可以把省份代码、省份名称冗余了,而无需再通过省份代码去查询省份名称。其次,确实需要查其他表的情况下,可以考虑使用分步查询的方法,通过应用程序完成数据的组装,这种效率在数据表很多的时候会更高效,而且代码也更好维护。 误区三:万能的枚举 例如下面这种表设计:


CREATE TABLE t_countries (
  ...
  country ENUM('', '1', '2', ..., '45'),
  ...
);

这种方式本来可以通过一个以整数为 key的字典的查找表实现。如果是业务上增加了一个枚举,意味着整个表都需要使用 ALTER TABLE更新。而如果是使用应用代码的查找表,只需要增加新的键值对就好了。 **应对方式:**如果枚举确定不会变动(例如性别),那么没问题。如果枚举可能会增加,那么尽可能地通过应用程序来实现。

误区三:滥用 SET替代 ENUM

枚举ENUM 类型是数据表列的值只能是值集合中的一个,而 SET 类型是该列可以有一个或多个值。如果确定一个列只会有一个值,那么就应该优先使用枚举,而不是集合。例如下面的例子就是典型的滥用:


CREATE TABLE t_payment_way (
  ...
  is_default SET('Y', 'N') NOT NULL DEFAULT 'N',
  ...
);

很显然,is_default 要么是 Y,要么是 N,因此这里应该使用 ENUM。 **应对方式:**从业务层面考虑列的值是不是可能有多个,如果只有1个可选值那么就用 枚举ENUM。

误区四:生硬地避免NULL

很多文章都讨论过尽可能地避免使用 NULL,对于大部分场景这是一个好的设计,我们可以通过0,空字符串,约定的值等来表示空值。然而,不要因为这个而生硬套用,如果是这个值本身就是一个无意义的值的时候,那么使用 NULL 可能更合适。例如,如果要是有-1代表一个无意义的整数,可能会导致代码很复杂,甚至可能引起 bug。例如下面的例子:


CREATE TABLE t_person (
  birthday DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  ...,
);

将一个 DATETIME 类型的默认值设置为全部是0会很奇怪,假设我们要统计人员的年龄平均值的时候,会引起莫名其妙的问题,而这种场景使用 NULL 就不会纳入到统计中来。可以通过设置 MySQL 的 SQL_MODE 参数禁止使用无意义的日期,避免出现这种情况。 **应对方式:**设计表的时候可以尽量使用 NOT NULL 避免空值,但是不要过于生硬,对于有些字段使用默认值无法表名意义或与实际不符时,也是可以选择使用 NULL 列的。只是,需要注意索引列不要使用NULL。而实际上,绝大部分索引列不太可能会是 NULL。

误区五:使用整数替换时间戳

之前有讲到过时间格式如何选择的问题,实际上有些开发者会使用整数来存储时间戳,他们的理由是这样效率更高。从某种意义上来说,可能会提高一点效率,但是帮助不大,因为在 MySQL 内部DATETIME 和 TIMESTAMP 本身就是用整数存储的。而如果使用整数存储时间的话,意味着应用程序中需要做时间转换,或者是 SQL 语句要对指定的字段进行时间转换,带来的收益可能得不偿失。 **应对方式:**尽可能地使用 DATETIME 存储时间,如果需要存储秒级精度一下的时间,那么可以考虑使用 BIGINT 来存储。

误区六:忘记字段的最大存储范围

在实际中设计表的时候会忘记数据类型的存储范围,比如使用 TINYINT(2)并不是只能存储两位整数,实际TINYINT(2) 可以存储的范围是-128-127。 存储超过255的整数。这种错误在使用整数类型的时候很容易出现问题,在插入整数的时候,MySQL 不会检查实际的整数位数,而是按对应存储字节数的范围存入,这种情况假设不注意会存入无意义的值。例如下面的 INSERT 操作会成功,而我们可能误以为 TINYINT(2)只能存储2位整数:


CREATE TABLE t_int_test (
    id INT PRIMARY KEY,
    number TINYINT(2)
);

INSERT INTO t_int_test (id, number) VALUES (3,123);

应对方式:在应用程序中做数据校验。

结语:

在实际设计数据表的过程中,除了需要考虑每个字段的数据类型之外,还需要考虑存储空间大小。对于常用的一些字段,如时间、标题、备注等,最好是内部形成一定的规范,大家遵照规范执行,并且增加校验能够避免很多问题。

以上就是MySQL 常见的数据表设计误区汇总的详细内容,更多关于MySQL 数据表设计误区的资料请关注自学编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 常见的数据表设计误区汇总

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 常见的数据表设计误区汇总

目录误区一:过多的数据列误区二:过多的联合查询误区三:滥用 SET替代 ENUM误区四:生硬地避免NULL误区五:使用整数替换时间戳误区六:忘记字段的最大存储范围结语:误区一:过多的数据列MySQL 存储引擎的 API 是按照行缓冲区方式从
2022-05-13

MySQL中常见的数据表设计误区有哪些

这篇文章将为大家详细讲解有关MySQL中常见的数据表设计误区有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。误区一:过多的数据列MySQL 存储引擎的 API 是按照行缓冲区方式从服务端和存储引擎复制
2023-06-15

MySQL数据库分区表设计原则

MySQL数据库分区表设计原则涉及多个方面,以下是一些关键原则:选择合适的分区键:分区键应该是经常用于查询和筛选的字段,同时要确保分区键的数据分布均匀,避免数据倾斜。根据查询频率进行分区:将经常查询的数据放在较小的分区中,减少查询范围,加
MySQL数据库分区表设计原则
2024-10-21

Excel数据导入Mysql常见问题汇总:如何处理数据丢失的情况?

Excel数据导入MySQL常见问题汇总:如何处理数据丢失的情况?在将Excel表格中的数据导入到MySQL数据库时,经常会遇到数据丢失的情况。这可能是由于数据格式不匹配、导入程序错误或其他原因导致的。下面将介绍一些处理数据丢失情况的常见问
2023-10-22

Excel数据导入Mysql常见问题汇总:如何处理导入数据时遇到的错误日志问题?

Excel数据导入Mysql常见问题汇总:如何处理导入数据时遇到的错误日志问题?导入Excel数据到MySQL数据库是一项常见的任务。然而,在这个过程中,我们经常会遇到各种错误和问题。其中之一就是错误日志问题。当我们尝试导入数据时,系统可能
2023-10-22

Excel数据导入Mysql常见问题汇总:如何处理数据格式转换的问题?

Excel数据导入Mysql常见问题汇总:如何处理数据格式转换的问题?导入Excel数据到MySQL数据库是一种常见的数据迁移方式,但在这个过程中经常会遇到数据格式转换的问题。本文将为读者总结一些常见的数据格式转换问题,并提供解决方案。日期
2023-10-22

Excel数据导入Mysql常见问题汇总:如何处理导入过程中的重复数据?

Excel数据导入Mysql常见问题汇总:如何处理导入过程中的重复数据?在数据处理的过程中,我们常常会遇到Excel数据导入到Mysql数据库的需求。然而,由于数据量庞大,很容易出现重复数据的情况,这就需要我们在导入过程中进行相应的处理。在
2023-10-22

PHP 数据库连接陷阱:避免常见的错误和误区

要避免 php 数据库连接错误,请遵循最佳实践:检查连接错误,变量名称与凭据匹配。使用安全存储或环境变量,避免硬编码凭据。使用完后关闭连接,防止 sql 注入,使用准备好的语句或绑定参数。PHP 数据库连接陷阱:避免常见的错误和误区在使用
PHP 数据库连接陷阱:避免常见的错误和误区
2024-05-21

MySQL 那些常见的错误设计规范,你都知道吗

依托于互联网的发达,我们可以随时随地利用一些等车或坐地铁的碎片时间学习以及了解资讯。同时发达的互联网也方便人们能够快速分享自己的知识,与相同爱好和需求的朋友们一起共同讨论。 但是过于方便的分享也让知识变得五花八门,很容易让人接收到错误的信息
2022-05-30

如何通过MySQL设计规约规避常见的数据库错误和问题?技术同学必备经验总结!

如何通过MySQL设计规约规避常见的数据库错误和问题?技术同学必备经验总结!摘要:MySQL是一种广泛使用的关系型数据库管理系统,但在实际应用中,由于设计不当、配置问题或者使用不当等原因,会出现一系列的数据库错误和问题。本文总结了一些常见的
2023-10-22

Excel数据导入Mysql常见问题汇总:如何处理导入数据过程中的冲突问题?

Excel数据导入Mysql常见问题汇总:如何处理导入数据过程中的冲突问题?导入数据是我们在实际工作中常常需要处理的任务之一,而Excel作为一种常见的数据源,往往用于导入数据到Mysql数据库中。然而,在数据导入的过程中,我们常常会遇到各
2023-10-22

Excel数据导入Mysql常见问题汇总:如何解决导入数据时遇到的乱码问题?

Excel数据导入Mysql常见问题汇总:如何解决导入数据时遇到的乱码问题?导入Excel数据到Mysql数据库是日常工作中常见的任务。但有时候在导入过程中,会遇到乱码问题,导致数据显示不正确。本文将总结常见的乱码问题,并提供解决方案,以帮
2023-10-22

Excel数据导入Mysql常见问题汇总:如何处理导入速度过慢的问题?

Excel数据导入MySQL是日常数据处理中常见的操作之一,但在实际操作中常会遇到导入速度过慢的问题。导入速度过慢会导致数据处理的效率降低,影响工作进程。本文将介绍一些解决导入速度过慢问题的方法,以帮助读者解决这一问题。首先,导入速度过慢的
2023-10-22

编程热搜

目录