字段规范 原

  1. char、varchar、text等字符串类型定义
    • 对于长度基本固定的列,如果该列恰好更新又特别频繁,适合char
    • varchar虽然存储变长字符串,但不可太小也不可太大。UTF8最多能存21844个汉字,或65532个英文
    • varbinary(M)保存的是二进制字符串,它保存的是字节而不是字符,所以没有字符集的概念,M长度0-255(字节)。只用于排序或比较时大小写敏感的类型,不包括密码存储
    • TEXT类型与VARCHAR都类似,存储可变长度,最大限制也是2^16,但是它20bytes以后的内容是在数据页以外的空间存储(row_format=dynamic),对它的使用需要多一次寻址,没有默认值。 一般用于存放容量平均都很大、操作没有其它字段那样频繁的值。 网上部分文章说要避免使用text和blob,要知道如果纯用varchar可能会导致行溢出,效果差不多,但因为每行占用字节数过多,会导致buffer_pool能缓存的数据行、页下降。另外text和blob上面一般不会去建索引,而是利用sphinx之类的第三方全文搜索引擎,如果确实要创建(前缀)索引,那就会影响性能。凡事看具体场景。 另外尽可能把text/blob拆到另一个表中
    • BLOB可以看出varbinary的扩展版本,内容以二进制字符串存储,无字符集,区分大小写,有一种经常提但不用的场景:不要在数据库里存储图片。
  2. int、tinyint、decimal等数字类型定义
    • 使用tinyint来代替 enum和boolean ENUM类型在需要修改或增加枚举值时,需要在线DDL,成本较高;ENUM列值如果含有数字类型,可能会引起默认值混淆 tinyint使用1个字节,一般用于status,type,flag的列
    • 建议使用 UNSIGNED 存储非负数值 相比不使用 unsigned,可以扩大一倍使用数值范围
    • int使用固定4个字节存储,int(11)与int(4)只是显示宽度的区别
    • 使用Decimal 代替float/double存储精确浮点数 对于货币、金额这样的类型,使用decimal,如 decimal(9,2)。float默认只能能精确到6位有效数字
  3. timestamp与datetime选择
    • datetime 和 timestamp类型所占的存储空间不同,前者8个字节,后者4个字节,这样造成的后果是两者能表示的时间范围不同。前者范围为1000-01-01 00:00:00 ~ 9999-12-31 23:59:59,后者范围为 1970-01-01 08:00:01 到 2038-01-19 11:14:07 。所以 TIMESTAMP 支持的范围比 DATATIME 要小。
    • timestamp可以在insert/update行时,自动更新时间字段(如 f_set_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP),但一个表只能有一个这样的定义。
    • timestamp显示与时区有关,内部总是以 UTC 毫秒 来存的。还受到严格模式的限制
    • 优先使用timestamp,datetime也没问题
    • where条件里不要对时间列上使用时间函数
  4. 建议字段都定义为NOT NULL
    • 如果是索引字段,一定要定义为not null 。因为null值会影响cordinate统计,影响优化器对索引的选择
    • 如果不能保证insert时一定有值过来,定义时使用default ‘’ ,或 0
  5. 同一意义的字段定义必须相同 比如不同表中都有 f_user_id 字段,那么它的类型、字段长度要设计成一样

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

SPOJ1043 GSS1(线段树)

注意查询的时候不能按照以前的方式写,因为不知道变量的下界,最稳妥的办法就是判三种情况

10910
来自专栏机器学习从入门到成神

Java知识点总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

20210
来自专栏xingoo, 一个梦想做发明家的程序员

AngularJS API之toJson 对象转为JSON

toJson()能把对象序列化为json 方法讲解 这个方法最多支持2个参数: angular.toJson(obj, pretty); obj 是想要转换的...

25550
来自专栏chenssy

【死磕Sharding-jdbc】---结果合并

接下来以执行 SELECT o.*FROM t_order o whereo.user_id=10order byo.order_id desc limit 2...

12730
来自专栏Albert陈凯

2018-10-24 Oracle中insert into select和select into的用法

在Oracle中select into from不可以使用-----原因很简单:select into是PL/SQL language 的赋值语句!如果使用则O...

9210
来自专栏用户2442861的专栏

[疯狂Java]JDBC:PreparedStatement预编译执行SQL语句

    1) SQL语句和编程语言一样,仅仅就会普通的文本字符串,首先数据库引擎无法识别这种文本字符串,而底层的CPU更不理解这些文本字符串(只懂二进制机器指...

37920
来自专栏Hongten

python开发_pickle

pickle模块使用的数据格式是python专用的,并且不同版本不向后兼容,同时也不能被其他语言说识别。要和其他语言交互,可以使用内置的json包使用pickl...

11520
来自专栏沃趣科技

MySQL排序内部原理探秘

一、我们要解决什么问题 二、排序,排序,排序 三、索引优化排序 四、排序模式 4.1实际trace结果 4.2排序模式概览 4.2.1回表排序模式 4.2.2不...

52360
来自专栏*坤的Blog

自写文件小工具类

18830
来自专栏IMWeb前端团队

bash 的条件和循环

本文作者:IMWeb 江源 原文出处:IMWeb社区 未经同意,禁止转载 原文 条件语句和循环可以统称为流程控制,是一门语言最基础的部分。 bash ...

19260

扫码关注云+社区

领取腾讯云代金券