
然而,在使用MySQL创建表时,开发者需要遵循一系列特殊限制和最佳实践,以确保数据的完整性和高效查询
本文将深入探讨MySQL建表过程中的特殊限制,并提供实用的建议,帮助开发者更好地管理和设计数据库
一、表名与字段名的命名规范 1.表名命名 -避免使用复数名词:表名应表示表内的实体内容,而非实体数量
例如,应使用“user”而非“users”
-小写字母与下划线:表名、字段名必须使用小写字母和下划线组合,禁止数字开头,禁止两个下划线中间只出现数字
例如,“getter_admin”是有效的,而“GetterAdmin”和“taskConfig”则不是
2.字段名命名 -避免MySQL保留关键字:如“desc”、“range”、“match”等,这些关键字不能用作表名、字段名或索引名
具体保留关键字可参考MySQL官方文档
-布尔字段命名:表达是与否概念的字段,必须使用“is_xxx”的方式命名,数据类型为unsigned tinyint(1表示是,0表示否,默认0)
-索引命名:唯一索引名为“uniq_字段名1_字段名2”,普通索引名为“idx_字段名1_字段名2”
字段名中的下划线符号应去除,并将下划线后的首字母改为大写
二、数据类型与存储限制 1.字符集选择 -统一字符集:建表时字符集统一用UTF8或者不指定(默认是UTF8),禁止对具体字段指定字符集
如需支持表情符号,应与DBA沟通讨论
2.数字类型 -整数类型:整数数字类型如果都是正整数,必须声明为unsigned,并根据业务实际情况选择tinyint、smallint、mediumint、int或bigint
例如,在unsigned情况下,tinyint最大值是255,smallint是65535
-小数类型:小数类型为decimal,禁止使用float和double,因为它们在存储时存在精度损失问题,可能导致比较时得到不正确的结果
3.字符串类型 -varchar长度:varchar是可变长字符串,不预先分配存储空间
长度建议控制在85以内(长度超过85需要多一个字节来存储该字段的长度),禁止长度超过5000
如果存储长度大于此值,应定义为text类型
但text类型能存储21845个字符,此时应尽量通过控制前端字符串长度来避免使用text
4.特殊数据类型限制 -禁止blob类型:数据库中只能存储图片的路径,禁止使用blob、mediumblob和longblob类型
-枚举与集合:业务数据表示类型、状态等含义字段禁止使用enum、set、bit数据类型,统一用tinyint
三、表结构与字段约束 1.必备字段 - 每张表必备三个字段:id、gmt_created、gmt_modified,且这些字段都不能为null
其中,id必须为主键,类型为unsigned int或bigint,单表时自增,初始值为1,步长为1
gmt_created和gmt_modified的类型均为datetime,分别表示记录创建时间和修改时间
如果需要存储毫秒,则可以使用datetime(3)类型
2.字段约束 -NOT NULL约束:建议表中每个字段都设置为NOT NULL
如果业务中可能没有值,则设置默认值
-UNIQUE约束:保证字段的值唯一
在业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引
-CHECK约束:从MySQL 8.0版本开始支持CHECK约束
例如,可以使用CHECK约束确保某个字段的值只能为特定的几种状态
四、索引与查询优化 1.索引类型 -普通索引:不设限制,可以存在重复值
-唯一索引:字段值必须唯一
-复合索引:针对多个列创建的索引
联合索引字段数不超过5个,一个表上索引个数不超过5个,特殊情况需与DBA沟通讨论
2.索引使用建议 -避免在过滤性差的字段上建索引:例如性别字段
如有特殊情况需与DBA沟通讨论
-利用索引的有序性:如果有order by的场景,应注意利用索引的有序性来避免额外的排序
五、特殊字符与命名灵活性 1.特殊字符列名 - MySQL允许在创建表时使用特殊字符作为列名,如@、、$、%、&等
但为了确保列名的有效性和可读性,通常建议使用反引号(`)将列名括起来
- 使用特殊字符作为列名可以增加表的可读性和灵活性,特别是在需要区分不同的数据类型或来源时
2.命名灵活性 - 尽管MySQL允许使用特殊字符和保留字作为列名(但需用反引号括起来),但在实际开发中,为了保持命名的一致性和可读性,建议遵循命名规范,避免使用特殊字符和保留字
六、表设计与性能考虑 1.数据冗余与性能 -字段允许适当冗余以提高性能,但必须考虑数据同步的情况
冗余字段应遵循以下原则:不是频繁修改的字段;不是varchar超长字段,更不能是text字段
2.单表数据量限制 - 单表数据量建议不要超过1000万
单表每月增长超过50万,考虑创建年表;如果月增长量超过500万,建议创建月表或者进行分库分表
但请注意,如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表
3.逻辑删除与物理删除 - 如果数据比较重要,而且业务上有对表数据进行删除的操作,建议进行逻辑删除(即在表中增加is_deleted字段)而不是物理删除
逻辑删除可以避免数据丢失,并方便数据恢复
但需要注意唯一约束问题,在多次删除后可能出现违反唯一约束的情况
七、总结与实践建议 1.遵循命名规范:表名、字段名应遵循统一的命名规范,以提高代码的可读性和可维护性
2.合理使用数据类型:根据业务需求合理选择数据类型,避免不必要的存储浪费和性能损失
3.充分利用索引:合理创建和使用索引,以提高查询效率
但也要注意索引的维护成本和对插入、更新操作的影响
4.考虑数据冗余与同步:在必要时可以适当冗余字段以提高性能,但必须确保数据同步的一致性
5.定期评估与优化:随着业务的发展和数据量的增长,应定期评估数据库的性能并进行必要的优化操作
通过遵循上述特殊限制和最佳实践,开发者可以更有效地管理和设计MySQL数据库,确保数据的完整性和高效查询
同时,也有助于提高代码的可读性和可维护性,降低开发和维护成本
MySQL跨服务器数据复制指南
MySQL建表:特殊限制与注意事项解析
Native For MySQL安装全攻略
MySQL:字符串与整数转换技巧
树莓派实战:安装与配置MySQL驱动全攻略
MySQL中读取与解析Base64数据技巧
MySQL主从复制实战指南,博客园详解
MySQL跨服务器数据复制指南
Native For MySQL安装全攻略
MySQL:字符串与整数转换技巧
树莓派实战:安装与配置MySQL驱动全攻略
MySQL中读取与解析Base64数据技巧
MySQL主从复制实战指南,博客园详解
MySQL是否允许同名账号解析
MySQL存储过程:批量插入多字段技巧
MySQL新建数据库权限缺失:如何解决与设置权限指南
速览!MySQL经典版官方下载指南
MySQL中存储图片的实用技巧
MySQL分页查询公式揭秘