数据库建表时,对于字段的数据类型的选择
本文是《数据库设计那些事》的笔记和思考。
有如下几种情形:
- 当字段可选择多个类型时(比如生日字段,可以用时间戳,即整数类型,可以用字符串 类型,也可以用日期 类型):整数、二进制 优于 日期 优于 字符串。
原因:
一、在对数据进行比较(查询条件、JOIN条件及排序)操作时:同样的数据,字符处理往往比数字要慢。
二、在数据库中,数据处理以页为单位,比如 mysql 16k字节一个页。而列的长度越小,在一个页中存储的数据就会越多。在加载相同多的数据的时候,如果列越小,加载的页就会越少。I/O的性能就会提高。
- 当字段要在 char 和 varchar 之间取舍的时候,有如下几条原则:
- 如果列中所要存储的数据长度是确定,且基本一致的,比如身份证字符串,则应该使用char;否则应该使用 varchar。
- 如果列中的最大数据长度小于50个字节,且这个列使用频繁,则应该使用char。如果列中的最大数据长度小于50个字节,但是很少使用,则基于减少空间和节省I/O的角度考虑,还是可以使用 varchar的。
- 一般不宜定义大于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类型有如下原则:
- decimal用于存储精确数据,而float只能用于存储非精确数据。故精确数据只能选择用decimal类型。
- 由于float类型的存储开销一般比decimal小,故非精确类型优先选择float。
数据库建表时,对于字段的数据类型的选择相关推荐
- MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效
问题描述:MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效.MySQL数据库中构建的用户表表结构如下所示: DROP TABLE IF ...
- 数据库建表时一定要设置外键约束关系吗?
数据库建表时一定要设置外键约束关系吗? 我们都知道每张数据表都有一个能够确定每行数据唯一性的字段,也就是主键.而在关系数据库中,常常有两表存在一定关系的情况.即一张表的主键跟另一张的外键存在对应关系, ...
- mysql建表时数据类型解释_关于数据库建表时字段数据类型
基础: char.varchar.text和nchar.nvarchar.ntext的区别 1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你 ...
- MySQL中级优化教程(五)——数据库建表时数据类型的选择
您可以到这里下载本篇博文所使用的数据库以及优化工具mysqldumpslow和pt-query-digest: https://blog.csdn.net/IT_TIfarmer/article/de ...
- mysql存储过程遍历新增_MySQL存储过程:内部调用存储过程、存储过程实现遍历数据库建表以及修改字段...
转载: https://blog.csdn.net/weixin_42159024/article/details/81488788 实现功能: 升级数据库.通过遍历所有数据库,对每个数据库进行升级, ...
- mysql建表时建外键约束_数据库建表时一定要设置外键约束关系吗?
如果被引用的表需要做分库分表,那么无法建立外键约束. 使用外键会降低数据库性能,这个说法并不细致.需要详细分析. 建立外键,那么一般引用字段上需要建立索引.如果不建立索引,被引用的表上删除数据,会全表 ...
- oracle数据库建表、修改字段名称类型、增加字段、ID自动增长写法
oracle建表: create table INDEX_POLICY_TBL ( ID NUMBER(10) NOT NULL PRIMARY KEY, PO ...
- mysql数据库建表关键字_关于数据库建表时的有趣实例--关键字重复
今天 使用CMD连接mysql进行简单的数据库的建表操作.信心满满的写了如下的代码: 然后就爆了个大大的错误 .简直有点莫名其妙的感觉,我是按照昨天学习的步骤写的代码,为什么会出错? 初步开始怀疑: ...
- 数据库建表时, 没有成功创建表 No migrations to apply报错原因和解决方法
一.在cmd中执行执行python manage.py makemigrations可以顺利创建0001_initial.py文件,但继续执行python manage.py migrate时出现No ...
最新文章
- ubuntu(16.04.01)学习-day1
- 深度学习:卷积层的实现
- Cookie利用神器:CookieHacker
- 分布式架构中一致性解决方案——Zookeeper集群搭建
- [NodeJs] 你有使用过npx吗?它主要解决什么问题?
- java list能作为入参吗_springmvc 不支持 List 对象作为 方法的参数
- ffplay.exe操作方式
- 2013下半年(11月)信息系统项目管理师考试题型分析(综合知识、案例分析、论文)...
- PowerShell说“此系统上的脚本执行被禁用。”
- 程序员最常说的那些口头禅
- 程序员之路:python3+PyQt5+pycharm桌面GUI开发
- 微信公众号之测试号申请
- 激光测距芯片VL53L0X的使用与代码
- vue3里面高德地图绘制3D图形
- 有太多工作要做,传蚂蚁集团IPO可能推迟至2022年
- java实现每天定时执行任务,Spring Task定时任务每天零点执行一次的操作
- 【软考四】软件知识产权基础知识(做题)
- 关于Java的char类型,字符集,字符编码三者的关系
- 【每周CV论文推荐】基于GAN的图像修复值得阅读的文章
- linux命令英文单词
热门文章
- std::upper_bound与std::lower_bound
- 摄影中的曝光补偿、白加黑减_我是亲民_新浪博客
- C++--顺时针打印矩阵
- WPS office出现“xxx.docx中发现无法读取内容,是否恢复此文档中的内容......word在试图打开文件时遇到错误” 紧急解决方案 -- 小黑日常超细解决教程
- office连接oracle,office2013怎么连接32位oracle
- 做期货能不能尽量不止损?
- 好尚不可为,其况恶乎(转)
- custom_filter
- vue-happy-scroll实现上拉加载更多(vue)
- Javafx+MySQL 学生成绩管理系统