赞
踩
数据库表结构的设计是最基础也是最重要的,因为一旦数据库表设计完毕并投入使用,将来再进行修改就相对比较麻烦,特别数据量大时增加字段修改字段类型都比较麻烦,因此在进行数据库设计的时候一定要尽可能的考虑周到。
数据库表设计要遵守如下原则:
不同的数据类型搜索的方式不同,所以说要选择合适的数据类型。用尽量少的存储空间来存数一个字段的数据, 缩小存储空间换取查询时间,能用int的就不用char或者varchar,能用tinyint的就不用int,使用UNSIGNED存储非负数值,其中无符号值可以避免误存负数,且扩大了表示范围。合适的字符存储长度,不但节约数据库表的存储空间、节约索引存储,更重要的是提升检索速度。 尽量使用数字型字段,提高数据比对效率。
①:字符类型
列的最大长度小于255则只需要额外占用一个字节来记录字符串的长度
列的最大长度大于255则需要额外占用两个字节来记录字符串的长度
②:数值类型
误区:
创建表时我们经常看到长度这一列,例如 tinyint(2),对于整型来说小括号中的2不是指的存储长度,而是指的零填充,对于字符串指的是长度,zerofill零填充,当数据的长度小于指定的长度时,会使用0来填充缺失的长度。零填充在mysql客户度中看不出来,使用命令行可以看出来。
如果tinyint(2)中的2代表长度,那么102就插入不成功,事实上是插入成功的
使用命令行可以看到1和2因不到两位长度,差一位,需要用0来填充
③:日期类型
根据实际需要选择能够满足应用的最小存储日期类型。
timestamp与datetime
timestamp所能存储的时间范围为:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999'
datetime占用8个字节 :datetime所能存储的时间范围为:‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’
总结:TIMESTAMP和DATETIME除了存储范围和存储方式不一样,没有太大区别。如果需要使用到时区就必须使用timestamp,如果不使用时区就使用datetime因为datetime存储的时间范围更大
注意:
使用PROCEDURE analyse() 来查看列的具体指标来帮助优化列。
SELECT * FROM tbl_user PROCEDURE analyse();
4. 是否为null
MySQL字段属性应该尽量设置为NOT NULL,除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL,对于没有值的指定一个默认值,如之前使用null的varchar可以默认为空字符串“”,之前是数字类型的可以用0做为默认值 。
注意:NULL在数据库里是非常特殊的,任何数跟NULL进行运算都是NULL, 判断值是否等于NULL,不能简单用=,而要用IS NULL关键字。使用 ISNULL()来判断是否为 NULL 值,NULL 与任何值的直接比较都为 NULL。
常用的存储引擎的选择有MYISAM、InnoDB、MEMORY,不同的存储引擎支持的功能不一样,MySQL5.5之后默认的是InnoDB。绝大部分场景都是使用InnoDB引擎。
建议:不要混合使用存储引擎,实际场景中会有MyISAM和InnoDB混合使用的情况,但是这样有问题,比如一个事务同时操作了myisam引擎的表和innodb引擎的表,而myisam是不支持事务的,就会造成myisam表没有回滚。现在开发中绝大部分都是使用InnoDB,也不经常见到myisam,至少我工作中没见到过。
mysql5.0之后默认为InnoDB创建表的时候可以指定engine,也可以通过alter table语句来修改存储引擎。
- create table tbl_user (
- ...
- )engine=InnoDB default charset=utf-8;
-
- -- 修改表引擎
- alter table tbl_user engine = innodb;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。