Mysql 表设计注意

如果没有特殊的情况,建议选择InnoDB引擎

每个表都应该有主键,可选择自增字段,或者整型字段。使用UNSIGNED整型可以增加取值的范围。例外的情况是,一些应用会频繁地基于某些字段进行检索,设计人员可能会认为这些字段/字段组合更适合做主键,因为它们更自然、更高效。

尽量将字段设置成NOT NULL。如果没有特殊的理由,建议将字段定义为NOT NULL。如果将字段设置成一个空字符串或设置成0值并没有什么不同,都不会影响到应用逻辑,那么就可以将这个字段设置为NOT NULL。NULL值的存储需要额外的空间,且会导致比较运算更为复杂,这会使优化器更难以优化SQL。当然,是否设置为NULL更应取决于你的业务逻辑,如果你确实需要,那么就设置它允许NULL值,NULL值虽然会导致比较运算更加复杂,但这比因为定义了NOT NULL默认值而导致应用逻辑出现异常要好

使用更短小的列,比如短整型。整型列的执行速度往往更快。

考虑使用垂直分区。比如,我们可以把大字段或使用不频繁的字段分离到另外的表中,这样做可以减少表的大小,让表执行得更快。我们还可以把一个频繁更新的字段放到另外的表中,因为频繁更新的字段会导致MySQL QueryCache里相关的结果集频繁失效,可能会影响性能。需要留意的一点是,垂直分区的目的是为了优化性能,但如果将字段分离了到分离表后,又经常需要建立连接,那可能就会得不偿失了,所以,我们要确保分离的表不会经常进行连接,这时,用程序进行连接是一个可以考虑的办法。

□ 存储精确浮点数时必须使用DECIMAL替代FLOAT和DOUBLE。

□ 建议使用UNSIGNED类型存储非负值。

□ 建议使用INT UNSIGNED存储IPV4。可以使用INET_ATON()、INET_NTOA()函数进行转换,PHP里也有类似的函数如ip2long()、long2ip()。

□ 整形定义中不添加显示长度的值,比如使用INT,而不是INT(4)。

□ 建议不要使用ENUM类型。

□ 尽可能不要使用TEXT、BLOB类型。

□ 在VARCHAR(N)中,N表示的是字符数而不是字节数,比如VARCHAR(255),最大可存储255个汉字。需要根据实际的宽度来选择N。此外,N应尽可能地小,因为在MySQL的一个表中,所有的VARCHAR字段的最大长度是65535个字节,进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存(对于这一点,MySQL 5.7后有了改进)。

字符集建议选择UTF-8

□ 存储年时使用YEAR类型。

□ 存储日期时使用DATE类型。

存储时间时(精确到秒)建议使用TIMESTAMP类型,因为TIMESTAMP使用的是4字节,DATETIME使用的是8个字节

□ 不要在数据库中使用VARBINARY或BLOB存储图片及文件等。MySQL并不适合大量存储这种类型的文件

□ JOIN(连接)字段在不同表中的类型和命名要一致。

□ 如果变更表结构可能会影响性能,则需要通知DBA审核

总结

  • 经验之谈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值