突然有开发人员问我,使用 varchar 来存储日期,索引查询效率上的区别。

oracle 中date 类型固定使用7个字节

mysql 中 date 类型使用3个字节,datetime使用8个字节(DATETIME的打包效率更高,对非分数部分需要5个而不是8个字节,并且所有三个部分都有一个小数部分,需要0到3个字节,具体取决于存储值的小数秒精度)

可以看出使用日期格式存储,比直接使用字符串存储使用的字节数要少(更省空间)

下面在oracle 中进行测试,测试的数据量级为 1亿6千万行数据,2列,日期列上有索引

因为列比较少,所以索引大小几乎和表大小一致。

理论上使用日期格式是要比字符串存储效率要高的,具体在查询中有多大的提升,下面用实践来检验。

测试日期字符串自动截断不包含时分秒,类似'07-MAR-19',9个字符

1千万行数据下,经过测试,范围查询,唯一查询,2者使用的时间差不多,几乎没有差别

在存储空间上,使用date类型要少30M,加上索引的空间,总共节省大约60M的存储空间。

结论1:在千万级别数据量下,几乎没有差别。

然后讲数据量量级巨大化,提升到亿级别,1亿6千万行数据(翻16倍)

--表大小相差400M,索引大小相差2G(非叶子节点块急剧增加),1表4G,2表6G

查询效率情况

索引范围扫描 60万行,查询效率基本没有差别

结论2: 在使用索引的情况下,等量的少部分范围扫描没有差别。

使用full index scan

扫描所有索引块的情况下。

SELECT /*+ index(tmp_test1 IDX_TMP_TEST1) */ count(insert_time) FROM tmp_test1;

执行时间为 5分36秒

字符串索引的扫描情况:

select /*+ index(tmp_test2 IDX_TMP_TEST2) */ count(insert_time) from tmp_test2;

执行时间为10分04秒

结论3:

在全索引扫描情况下,由于扫描的数据块有差别,导致字符串索引耗时更长(这个其实影响也和I/O效率有关,I/O越强,影响越小)

datetime 索引_date类型和varchar类型在查询索引效率上比较相关推荐

  1. nvarchar类型和varchar类型

    文章目录 写在前面 一.nvarchar是什么? 二.nvarchar与varchar的区别 1.varchar是非Unicode可变长度类型,nvarchar是Unicode编码可变长度类型 2.它 ...

  2. 数据库中id类型和varchar类型的区别

    区别 id是唯一标识符 varchar是一种数据类型

  3. oracle存储返回sql查询,如何做才能使record类型和table类型存储查询语句返回的多条记录?...

    CREATE OR REPLACE PROCEDURE Zxt_type_Study Is /* type 的使用 */ Testrow1 Test%ROWTYPE; TYPE Aa IS TABLE ...

  4. MySQL字段为varchar类型和int类型索引的使用技巧

    MySQL索引使用:字段为varchar类型时,条件要使用' '包起来 结论: 当MySQL中字段为int类型时,搜索条件where num='111' 与where num=111都可以使用该字段的 ...

  5. 数据库中的字段varchar类型和char类型的区别?

    数据库中的字段varchar类型和char类型的区别? 目录 数据库中的字段varchar类型和char类型的区别?

  6. DATETIME类型和BIGINT 类型互相转换

    项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========= ...

  7. (Redis_学习一)Redis关于string类型和hash类型数据操作

    Redis关于string类型和hash类型数据操作 set name xiaohongyang // get name setnx name xiaohy get name setex name 1 ...

  8. Java学习(4)—— 布尔类型、基本数据类型转换、基本数据类型和String类型的转换

    布尔类型 也叫Boolean类型,boolean只允许取true和false. boolean占一个字节. 适用于逻辑运算,流程控制语句. 有默认类型,是false.但是应该声明为成员变量或是静态变量 ...

  9. *floa类型和long类型那个取值范围更大?

    *floa类型和long类型那个取值范围更大? 作为基础知识.我们都知道float在内存中占用4个字节的空间,而long型占用8个字节的空间. 但float的取值范围是-3.403E38-3.403E ...

最新文章

  1. Pieczęć(模拟)
  2. boost::mp11::mp_fold_q相关用法的测试程序
  3. vue-cli 3.0配置webpack目录别名alias
  4. 使用identity+jwt保护你的webapi(一)——identity基础配置
  5. 6-5 顺序表操作集 (20 分)(创建,查找,插入,删除)以及顺序表的理解
  6. 【华为云技术分享】自动网络搜索(NAS)在语义分割上的应用(二)
  7. 清华软件工程硕士放弃百万年薪后,4年狂赚1100亿,却被央视点名批评!
  8. 笔耕不辍 | Redis入门
  9. 房地产里有多少“三季人”?
  10. 8.局部变量、成员变量、jvm垃圾回收机制 、封装、this关键字、匿名对象
  11. 输入法公司Kika完成2.2亿B+轮融资 猎豹移动领投
  12. android更改menu字体颜色,Android 修改 Menu字体颜色
  13. 故障恢复控制台主要命令
  14. Python max函数
  15. GoLang之init函数
  16. 移动4G DTU_联通4G DTU_电信4G DTU
  17. 超详细的MySQL入门教程(五)
  18. 81.一名【合格】前端工程师的自检清单
  19. 新闻管理系统——新闻详情页面+评论模块
  20. 小白兔是世界上笑话最多的禽兽

热门文章

  1. hibernate fetch使用
  2. merge-two-smerge-two-sorted-listsorted-lists
  3. 【FFmpeg】FFmpeg常用基本命令
  4. Extjs4.2+webAPI+EF实现分页以及webapi的数据传值
  5. Java 动态语言
  6. NetBeans 时事通讯(刊号 # 57 - May 27, 2009)
  7. java web 哪些方法不能被从写_JAVA_WEB面试题
  8. BigInteger类实例的构造过程——JDK源码解析
  9. c语言试题 改错题,精选二级C++试题 – 改错题
  10. python基本概念关系图_Python基本概念