设计表时,不管是在MSSQL还是MySQL或者Oracle,变长字段的长度衡量都是要经常面对的。

对于一个变长的字段,在满足业务的情况下(其实所谓的满足业务是一个比较模糊的东西),到底是选择varchar(50)还是varchar(200)亦或是varchar(500)?

对于保守型选择,往往是选择一个较大的长度,比如varchar(500)要比varchar(50)更具有兼容性,由于其是变长字段的原因,存储空间也一样。

这样的选择并不能说就不好,看站在哪个角度来看问题。

那么,相对于varchar(50),varchar(500)在更具备兼容性的同时,有哪些不好的地方,也是需要思考的,。

这里的原则就是:对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。

以下是一个相对极端的例子,以SQL Server为例,

TestVarchar1和TestVarchar2的SortColumn 字段长度分别是varchar(50)和varchar(8000),两个表写入10000条测一样的试数据,

SortColumn 的实际长度是36个字符。

Create TableTestVarchar1

(

IdINT IDENTITY(1,1),

SortColumnvarchar(50)

)Create TableTestVarchar2

(

IdINT IDENTITY(1,1),

SortColumnvarchar(8000)

)DECLARE @SortColumn char(36);set @SortColumn = CAST(NEWID() as char(36))insert into TestVarchar1(SortColumn) values (@SortColumn)insert into TestVarchar2(SortColumn) values (@SortColumn)GO 10000

1,基于存储空间的考虑

存储空间上,存储不超过一定长度的变长字段,不同长度的变长字段存储空间是一样的,比如选择使用varchar(50)和varchar(500)是一样的,

也就说,对于不超过50个字符串的数据存储,两者在物理空间占用上并没有区别。

这里会发现,两个表的数据在完全一致的情况下,其存储空间也是完全一样的,的确,并不会因为varchar使用一个较长的长度而多占用存储空间

2,基于性能的考虑

选择varchar(50)还是varchar(8000),在性能上确实有显著的差异,考虑到某些查询需要内存(Memory Grant),查询引擎会预估当前查询需要的内存,影响查询内存的因素有以下几个方面

1,查询的类型,有没有聚合运算,有没有排序等等

2,每个操作符涉及到的记录数量

3,数据行的大小(这里是字段类型的长度而不是字段实际长度)

当行记录的数据类型长度较大的时候,执行计划预估的平均大小较大,数据类型定义的长度越大,预估的长度越大,需要分配的内存越大

如果一个查询涉及一些聚合操作并且数据量较大,就可能需要大量的内存来完成这个查询,查询引起会分配多余实际需要的内存。

两者对数据行Size的预估是一样的(尽管是完全一样的数据)

造成的结果就是两个查询的内存授予是一样的,同时第二个执行计划还有一个警告信息(黄色的感叹号)

以上可以看出,尽管两个表的数据是完全一致的,

不过字段的最大长度不一致,造成执行计划预估出现较大的偏差,因此给予较高的内存,浪费无所谓的资源。

再看一个通过聚合函数操作两张表的例子,会增加CPU的使用。

因此对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。

mysql设计表时 varchar长度_设计表的时候,对变长字段长度选择的一点思考相关推荐

  1. 设计表的时候,对变长字段长度选择的一点思考

    原文:设计表的时候,对变长字段长度选择的一点思考 不管是在MSSQL还是MySQL或者Oracle,变长字段的长度衡量都是要经常面对的. 对于一个变长的字段,在满足业务的情况下(其实所谓的满足业务是一 ...

  2. 对于表列数据类型选择的一点思考

    对于表列数据类型选择的一点思考 简介 SQL Server每个表中各列的数据类型的选择通常显得很简单,但是对于具体数据类型的选择的不同对性能的影响还是略有差别.本篇文章对SQL Server表列数据类 ...

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

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

  4. mysql建表时主键_mysql建表时怎么设置主键?

    设置方法:在"CREATE TABLE"语句中,通过"PRIMARY KEY"关键字来指定主键,语法格式"字段名 数据类型 PRIMARY KEY [ ...

  5. mysql建表时主键_mysql建表时设置主键的方法

    mysql建表时设置主键的方法 发布时间:2020-10-10 15:17:28 来源:亿速云 阅读:119 作者:小新 mysql建表时设置主键的方法?这个问题可能是我们日常学习或工作经常见到的.希 ...

  6. MySQL笔记:第06章_多表查询

    第06章_多表查询 多表查询概述 1.一个案例引发的多表连接 1.1 案例说明 1.2 笛卡尔积(或交叉连接)的理解 演示代码 2. 多表查询分类讲解 分类1:等值连接 vs 非等值连接 等值连接 非 ...

  7. mysql创建表时显示错误_MYSQL创建表出现错误 ERROR Code 1118如何解决

    ERROR Code 1118.Row size too large. The maximum row size for the used table type, not counting BLOBs ...

  8. mysql 创建表时提示错误代码_MySQL创建表时遇到的错误

    学习MySQL第一个程序就遇到了bug .创建表时需注意的事项加以总结: 1.先创建数据库: create database 数据库名:然后连接要用的数据库 use 数据库名:下面就可以执行建表语句 ...

  9. mysql主键干嘛的_数据库表中的主键有什么作用?

    展开全部 数据库主键 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样e69da5e6ba9062616964757a686964616f31333365643534的一列或多列 ...

最新文章

  1. 使用Asible批量部署Apache
  2. java 找不到方法,已经定义的方法找不到
  3. Java List 排序 :Lambda表达式sort排序
  4. 华为荣耀6 H60-L02/L12(联通版)救砖包【适用于无限重启】
  5. 常用命令集合_Windows
  6. stm32 lwip 如何发送不出_mbedtls | 移植mbedtls库到STM32裸机的两种方法
  7. 虚拟专题:知识图谱 | 医学知识图谱构建关键技术及研究进展
  8. Eclipse SVN冲突解决方案
  9. 扎克伯格夏威夷州大肆买地引发当地不满 被批搞“新殖民主义”
  10. 使用VScode + PicGo 写markdown 以及github图片加载不出的问题
  11. canfd收不到数据_CAN FD网络的通信距离问题分析
  12. 国内Docker镜像加速汇总
  13. create table
  14. 英语知识(与字面意思 相反的) Corner office
  15. cpci无法检索_CPCI是什么检索
  16. 关于视频后期美白的一些事
  17. 最流行的前端框架vue基础
  18. 只有失去的时候,才知道它的珍贵,QQ成为不明真相的群众发泄怒火的最大牺牲品...
  19. 【Markdown基础教程】编辑环境的下载
  20. html5 plus 支付,h5+ app 第三方支付调用步骤

热门文章

  1. lambdas_借助Java 8和lambdas,可以一起使用AssertJ和Awaitility
  2. 计算机组成原理的判断题,2《计算机组成原理A》判断题
  3. 干掉Postman?测试接口直接生成API文档,这工具强烈推荐!
  4. 程序员写代码崩溃,路过的暖心美团骑手:我帮你看看!
  5. 也许,这样理解 HTTPS 更容易!
  6. MySQL百万级数据分页查询及优化
  7. 10a 16a 插座区别_10A插座和16A插座有什么区别?
  8. html网页共用头部和脚部,如何在HTML不同的页面中,共用头部与尾部?_html/css_WEB-ITnose...
  9. python输出大小不同的字体_python – 为什么我的truetype字体大小为11渲染与windows不同?...
  10. CascadePSP 测试笔记