当前位置: 首页 > 科技观察

MySQL-关于数据库建表的一些看法和建议

时间:2023-03-16 17:58:17 科技观察

MySQL作为关系型数据库,用于存储持久化数据,所以建表是不可避免的。如果不使用ORM(ObjectRelationalModel)自动建表,开发者就需要使用图形界面(Navicat)或者手写MySQL语句。在生产环境中,我们通常通过命令行来操作MySQL数据库。所以建议建表时手写MySQL语句(不建议使用图形界面建表)。1、添加注释的格式在编写MySQL语句的时候,我们通常需要添加注释。推荐的注释格式是:原因:这种注释格式也会被MySQL解析器认为是注释,然后你的语句才会被正确执行。创建表相关语句。我们通常把要改的sql语句组织成一个1.0.0.sql文件,然后只需要登录MySQL客户端,输入:source/filedirectory/1.0.0.sql。因此,这样的注解可以起到一箭双雕的作用。2、指定表的引擎和默认编码格式,以及表的示例语句如下:原因:上面显示的指定引擎是innodb,5.6之前默认引擎是MyISAM,现在主流推荐更好的性能是innodb,具体参考:HighPerformanceMySQLbook。上面还规定了默认字符集是utf8,不要忘记用注释来注释这个表的用途,让其他开发者明白这个表的用途。3、一个经典的建表语句示例及示例语句分析如下:注意事项如下:1)所有字段都要用comcomet注释。或者我们可以通过命令showcreatetabletb_example查看表的结果信息。2)int符号确定。如果判断整数为非负数,则将int设置为unsigned类型,即intunsigned,可以将取值范围增加一半,避免插入负数。很多场合都会用到int设置为unsigned的场景。3)变长varchar的长度设置对于变长字符串varchar,如果不确定字符串长度(已知字符串长度小于255),可以设置为vachar(255)。此时存储空间只比普通段多一个字符(与设置varcahr(10)额外存储空间相同),可以最大限度地利用varchar的特殊性。注意:超过255,用来存放长度的空间会多一个字节。具体参考:高性能MySQL。4)有限状态的类型设置,建议将表示状态值的数据类型设置为tinyintunsigned(只占一个字节的空间),可以表示0到255的范围。注:没有需要用int,占用四个字节的空间。5)字段创建时间ctime和修改时间mtime尽量在每张表中添加字段创建时间ctime和字段修改时间mtime,方便后期排查,知道记录是什么时候插入的,什么时候插入的被修改。6)日期时间设置为int时查询。这里的ctime表示创建时间,用unix时间戳来存储,但是不能设置默认值unix_timestamp()。我们在实际查询的时候,可以使用from_unixtime(ctime)来将unix时间戳转换为date日期格式。示例如下:效果如下:7)所有字段尽量设置为notnull。8)尽量设置默认值。例如:在app_name中设置默认值'',click_cnt设置默认值'0'。9)将可能查询的字段设置为索引,如:keyidx_date("date"),这里因为可能查询到一段时间内的数据,所以添加字段"date"的索引。注:一般的索引命名规则为idx_字段名10)设置唯一索引根据业务确定哪些字段或字段组合值是唯一的,然后将字段或字段组合设置为唯一索引。例如:uniquekeyunique_date_appid("date","app_id")这里根据业务,我们只需要在特定的一天有一个特定应用的记录即可。因此,设置一个联合唯一索引可以防止相应的应用程序从另一天重复插入数据。注:唯一索引的命名规则为:unique_field1_field2。11)SQLPRIMARYKEY约束PRIMARYKEY约束唯一标识数据库表中的每条记录。主键必须包含唯一值。主键列不能包含NULL值。每个表应该有一个主键,每个表只能有一个主键。一个小知识点:由于我们添加了唯一索引unique_date_appid,如果插入重复的date和app_id组合,会报联合索引重复错误。例如再次执行:提示:我们可以通过返回结果result来判断,如果结果为0,则表示重复插入。