本文是《数据库设计那些事》的笔记和思考。

有如下几种情形:

  • 当字段可选择多个类型时(比如生日字段,可以用时间戳,即整数类型,可以用字符串 类型,也可以用日期 类型):整数、二进制 优于 日期 优于 字符串。

原因:

一、在对数据进行比较(查询条件、JOIN条件及排序)操作时:同样的数据,字符处理往往比数字要慢。

二、在数据库中,数据处理以页为单位,比如 mysql 16k字节一个页。而列的长度越小,在一个页中存储的数据就会越多。在加载相同多的数据的时候,如果列越小,加载的页就会越少。I/O的性能就会提高。

  • 当字段要在 char 和 varchar 之间取舍的时候,有如下几条原则:
  1. 如果列中所要存储的数据长度是确定,且基本一致的,比如身份证字符串,则应该使用char;否则应该使用 varchar。
  2. 如果列中的最大数据长度小于50个字节,且这个列使用频繁,则应该使用char。如果列中的最大数据长度小于50个字节,但是很少使用,则基于减少空间和节省I/O的角度考虑,还是可以使用 varchar的。
  3. 一般不宜定义大于50字节的char类型列。

解释:每一个 varchar 的列,除了存储数据需要的字节之外,还需要额外的字节存储数据的实际长度。在检索数据时,也需要确定数据的起止位置。

所以,对于 utf-8 编码的字符串,超过15个字符,就要考虑使用 varchar。

不过生活总是充满各种反转和意外的,对于char 和 varchar 应该如何选择,我看到一篇博文上说和存储引擎的选择有很大关系。说的似乎也很有道理:

InnoDB 存储引擎 建议使用VARCHAR类型。
对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR,因此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。

这就很让人纠结了。到底该听谁的?外事不决问google,然后我就在stackoverflow 那发现一个很有启发性的建议:

MySQL’s indexing is good enough that the difference in performance is tiny. It’s only when tables get large ( meaning on the order of 10**9 rows or more ) that the performance difference between VARCHAR() and CHAR() starts to be meaningful.

It’s smarter to spend your precious development time making your app nice enough that you have a chance of attracting gazillions of users. And when you have them, you probably can get a really competent database administrator to help you fix your minor inefficiencies.

大意就是,mysql的速度已经很快了,尤其是使用了索引之后,选 char 和 varchar 对于性能的提升根本微不足道。老老实实把你的 app 做大才是重点,别整天整这些有的没的。

这个兄弟说话很对我胃口啊,看起来也是个全栈工程师。是贫道执迷了。这个知识点先跳过。

  • 对于decimal和 float类型有如下原则:
  1. decimal用于存储精确数据,而float只能用于存储非精确数据。故精确数据只能选择用decimal类型。
  2. 由于float类型的存储开销一般比decimal小,故非精确类型优先选择float。

数据库建表时,对于字段的数据类型的选择相关推荐

  1. MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效

    问题描述:MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效.MySQL数据库中构建的用户表表结构如下所示: DROP TABLE IF ...

  2. 数据库建表时一定要设置外键约束关系吗?

    数据库建表时一定要设置外键约束关系吗? 我们都知道每张数据表都有一个能够确定每行数据唯一性的字段,也就是主键.而在关系数据库中,常常有两表存在一定关系的情况.即一张表的主键跟另一张的外键存在对应关系, ...

  3. mysql建表时数据类型解释_关于数据库建表时字段数据类型

    基础: char.varchar.text和nchar.nvarchar.ntext的区别 1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你 ...

  4. MySQL中级优化教程(五)——数据库建表时数据类型的选择

    您可以到这里下载本篇博文所使用的数据库以及优化工具mysqldumpslow和pt-query-digest: https://blog.csdn.net/IT_TIfarmer/article/de ...

  5. mysql存储过程遍历新增_MySQL存储过程:内部调用存储过程、存储过程实现遍历数据库建表以及修改字段...

    转载: https://blog.csdn.net/weixin_42159024/article/details/81488788 实现功能: 升级数据库.通过遍历所有数据库,对每个数据库进行升级, ...

  6. mysql建表时建外键约束_数据库建表时一定要设置外键约束关系吗?

    如果被引用的表需要做分库分表,那么无法建立外键约束. 使用外键会降低数据库性能,这个说法并不细致.需要详细分析. 建立外键,那么一般引用字段上需要建立索引.如果不建立索引,被引用的表上删除数据,会全表 ...

  7. oracle数据库建表、修改字段名称类型、增加字段、ID自动增长写法

    oracle建表: create table INDEX_POLICY_TBL       (        ID NUMBER(10) NOT NULL PRIMARY KEY,        PO ...

  8. mysql数据库建表关键字_关于数据库建表时的有趣实例--关键字重复

    今天 使用CMD连接mysql进行简单的数据库的建表操作.信心满满的写了如下的代码: 然后就爆了个大大的错误 .简直有点莫名其妙的感觉,我是按照昨天学习的步骤写的代码,为什么会出错? 初步开始怀疑: ...

  9. 数据库建表时, 没有成功创建表 No migrations to apply报错原因和解决方法

    一.在cmd中执行执行python manage.py makemigrations可以顺利创建0001_initial.py文件,但继续执行python manage.py migrate时出现No ...

最新文章

  1. ubuntu(16.04.01)学习-day1
  2. 深度学习:卷积层的实现
  3. Cookie利用神器:CookieHacker
  4. 分布式架构中一致性解决方案——Zookeeper集群搭建
  5. [NodeJs] 你有使用过npx吗?它主要解决什么问题?
  6. java list能作为入参吗_springmvc 不支持 List 对象作为 方法的参数
  7. ffplay.exe操作方式
  8. 2013下半年(11月)信息系统项目管理师考试题型分析(综合知识、案例分析、论文)...
  9. PowerShell说“此系统上的脚本执行被禁用。”
  10. 程序员最常说的那些口头禅
  11. 程序员之路:python3+PyQt5+pycharm桌面GUI开发
  12. 微信公众号之测试号申请
  13. 激光测距芯片VL53L0X的使用与代码
  14. vue3里面高德地图绘制3D图形
  15. 有太多工作要做,传蚂蚁集团IPO可能推迟至2022年
  16. java实现每天定时执行任务,Spring Task定时任务每天零点执行一次的操作
  17. 【软考四】软件知识产权基础知识(做题)
  18. 关于Java的char类型,字符集,字符编码三者的关系
  19. 【每周CV论文推荐】基于GAN的图像修复值得阅读的文章
  20. linux命令英文单词

热门文章

  1. std::upper_bound与std::lower_bound
  2. 摄影中的曝光补偿、白加黑减_我是亲民_新浪博客
  3. C++--顺时针打印矩阵
  4. WPS office出现“xxx.docx中发现无法读取内容,是否恢复此文档中的内容......word在试图打开文件时遇到错误” 紧急解决方案 -- 小黑日常超细解决教程
  5. office连接oracle,office2013怎么连接32位oracle
  6. 做期货能不能尽量不止损?
  7. 好尚不可为,其况恶乎(转)
  8. custom_filter
  9. vue-happy-scroll实现上拉加载更多(vue)
  10. Javafx+MySQL 学生成绩管理系统