必须把字段设计为 NOT NULL 并且提供默认值:null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更加难优化;null类型在MySQL中需要特殊处理,消耗数据库性能;null值需要更多的存储空间,无论是表还是索引中的null值都需要额外的空间来标识;对null的处理只能使用is null 或is not null,而不能采用=、in等操作符号。
禁止 使用TEXT、BLOB类型:浪费更多的磁盘和内存空间,导致缓存命中率低,影响性能
禁止 使用小数存储货币:小数容易导致精度误差
必须使用varchar(20)存储手机号:可能涉及区号或国家代码,varchar支持模糊查询 like
禁止 使用INSERT INTO t_xxx VALUES(xxx), 必须显示指定插入的列属性:容易在增加或删除字段后出现程序BUG
禁止 使用属性隐式转换:会导致不能命中索引,而采用全表扫描;SELECT uid FROM tuser WHERE phone=13812345678会导致全表扫描,而不能命中phone索引,因为phone字段是varchar(20),正确的写法是:SELECT uid FROM tuser WHERE phone=’13812345678′;
禁止 在WHERE条件的属性上使用函数或者表达式:会导致不能命中索引,而采用全表扫描;SELECT uid FROM tuser WHERE fromunixtime(day)>=’2017-02-15’会导致全表扫描,正确的写法是:SELECT uid FROM tuser WHERE day>=unixtimestamp(‘2017-02-15 00:00:00’)