数据库选择合适的字段

 

1. 总体原则
1.  使用合适的数据类型,满足要求,提高效率
2.  优先使用数字类型的字段,mysql处理数字类型字段较快
1.1 三大类型
1.1.1 数字类型
整型
1. TINYINT(1byte)
2. SMALLINT(2byte)
3. MEDIUMINT(3byte)
4. INT、INTEGER(4byte)
5. BIGINT(8byte)


一般根据实际需要(现在和未来的情况)选择合适的数字类型,减少存储,加快操作。
整数类型有一个属性:AUTO_INCREMENT。自增,一般用于主键。支持多线程,不会有自增冲突。
浮点型和定点型
1. FLOAT(4byte)[(M,D)]一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个参数表示一个单精密浮点数字。
2. DOUBLE(8byte)[(M,D)]一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。M是显示宽度而D是小数位数。没有一个参数的DOUBLE或FLOAT(X)(25 < = X < =53)代表一个双精密浮点数字。
3. DECIMAL[(M[,D])]定点数类型,我们基本用不到。


浮点数如果不标明精度和标度,则会按照实际的精度显示。
浮点数如果标明精度和标度,则会四舍五入后的结果插入,并且不报错。
定点数如果不标精度和标度,按照decimal(10,0)来处理,如果超过了精度和标度值,会报错。
1.1.2 时间日期类型
1. DATE(4byte)日期类型。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,允许使用字符串(常用)或数字把值赋给DATE列。表示年月日。
2. TIME(3byte)。时间类型。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。表示时分秒,mysql不支持毫秒。
3. DATETIME(8byte)日期时间类型。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。经常用到,表示年月日时分秒。
4. TIMESTAMP(4byte)时间戳类型。范围是'1970-01-01 00:00:00'到2037年的某时。一般用来刷新操作时间用的。设置ON UPDATE CURRENT_TIMESTAMP,插入或者更新本条记录,会刷新到系统时间。 一个表中只能有一个timestamp类型允许默认为CURRENT_TIMESTAMP,否则会报错。如果仅仅是记录时间,建议使用datetime。
5. YEAR(1byte)年份类型。允许的值是1901到2155,MySQL以YYYY格式来显示YEAR值,但是允许你把使用字符串或数字值赋给YEAR列。
1.1.3 字符串类型
1. CHAR(M)定长字符串,当存储时,总是是用空格填满右边到指定的长度。如:MD5定义为char(32)。M的范围是1-255个字符。当值被检索时,空格尾部被删除。CHAR值可以根据缺省字符集以大小写不区分的方式排序和比较,但不提倡在数据库中操作字符串,降低性能。
2. VARCHAR(M)变长字符串。当值被存储时,尾部的空格被删除,变长存储,空间是M+1 byte
3. TEXT和BLOB存储大文本时候使用。BLOB能用来存储二进制数据,比如照片。TEXT只能保存字符数据。操作TEXT和BLOB类型容易引起性能问题,特别是执行大量的更新操作时候。建议少用两个字段,如果可以的话转移到hbase中存储,或者把BLOB或TEXT列分离到单独的表中。


字符串类型尽量不做主键,影响效率。
在innodb(我们的数据库表都是)下,建议使用VARCHAR类型,mysql会根据字符的长度进行对应存储,相对char节省空间。因此使用VARCHAR来最小化需要处理的数据行的存储总 量和磁盘I/O是比较好的。
如果经常查询字符串类型,可以建立索引或者前缀索引(只索引字符串类型的前几个字符)


1.1.4 其他类型
1. ENUM枚举类型。不建议使用,操作不便,不易移植。替代方案,在程序中使用枚举类型,存储在mysql中对应tinyint或者smallint类型
2. SET集合类型,如指定SET('one', 'two') NOT NULL,只有''",'one','two','one,two'四种情况。。不建议使用,操作不便,不易移植。替代方案,在程序中自己维护。
3. mysql还有其他的数据类型,但是建议少用。


1.2 注意事项
1.2.1 避免使用NULL字段
很难进行查询优化(is/not null),NULL列加索引需要额外空间,含NULL复合索引无效
1.2.2 如果可以的话将字符转化为数字
数字型比字符串型索引更高效,查询更快、用空间更小
1.2.3 不在数据库里存图片
1.2.4 尽量不用 SELECT *  
用SELECT*时,更多消耗CPU、内存、IO、网络带宽
建议只取需要数据列,减少表变化带来的影响,为使用覆盖索引提供可能性
1.2.5 同数据类型的列值比较
原则:数字对数字,字符对字符
数值列与字符类型比较,同时转换为双精度,进行比对
字符列与数值类型比较,字符列整列(如果几百万,可怕!)转数值,不会使用索引查询
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值