日期:2014-05-16  浏览次数:21415 次

datetime列是否有必要建索引
准备用一datetime列存储 登记时间;
1、索引最好建立在重复性较多的列,datetime很明显重复性很少,建立索引有用吗?
2、重复性较少的记录,如果建立索引,是否索引要耗去很多存储空间?
3、如果SQL查询一般是按天来查,是否有必要新增一个date冗余列来存储 登记日期?
4、char(8),date,int都可以存储日期,char和int还有更好的移植性,是这样?
------解决方案--------------------
准备用一datetime列存储 登记时间;
1、索引最好建立在重复性较多的列,datetime很明显重复性很少,建立索引有用吗?---如果你的查询中有用到时间列作为where条件的判断,当然是有必要建所以的了。
2、重复性较少的记录,如果建立索引,是否索引要耗去很多存储空间?---正常情况下,一个包含一列的非聚集索引,所占用的空间大约是表空间的20%--25% ,当然索引越多,肯定占用的空间也就越多了。
3、如果SQL查询一般是按天来查,是否有必要新增一个date冗余列来存储 登记日期? ---有必要,其实如果是这样的话,你存储时间的列就直接为date呗,不过如果时间列有其他用处,多建一个冗余也可以。
4、char(8),date,int都可以存储日期,char和int还有更好的移植性,是这样?---关于移植性这个研究的不多,应该是影响不大的吧
------解决方案--------------------
1、索引最好建立在重复性较多的列,datetime很明显重复性很少,建立索引有用吗?
通常很适合建索引
2、重复性较少的记录,如果建立索引,是否索引要耗去很多存储空间?
大部分情况下不会,重复性越小效率越高
3、如果SQL查询一般是按天来查,是否有必要新增一个date冗余列来存储 登记日期?
可以考虑,日期convert会导致原列上索引无效。
4、char(8),date,int都可以存储日期,char和int还有更好的移植性,是这样?
也不一定,数据类型是约束,除了保证数据的一致性之外,还可以带来很多优势,使用不合适的数据类型将丢失这些优势
------解决方案--------------------
3、如果SQL查询一般是按天来查,是否有必要新增一个date冗余列来存储 登记日期?

不需要考虑。如果是按天查
语句应该是这样的. 可以用到索引,请不要使用convert,(会用不到索引)
select * from tb 
where (createtime >='2014-4-10' and createtime<'2014-4-11')

其他,请参考2楼。
------解决方案--------------------
引用:
准备用一datetime列存储 登记时间;
1、索引最好建立在重复性较多的列,datetime很明显重复性很少,建立索引有用吗?
2、重复性较少的记录,如果建立索引,是否索引要耗去很多存储空间?
3、如果SQL查询一般是按天来查,是否有必要新增一个date冗余列来存储 登记日期?
4、char(8),date,int都可以存储日期,char和int还有更好的移植性,是这样?

第一个问题,大原则是,只要有直接比较的查询如=,>,<列名这样的,就需要建索引。
第二个问题,存储空间消耗基本是一样的,中间节点的键值多几位标识而已,相对叶子节点的存储空间很小
第三个问题,如果这个查询运行频繁就有必要,同时要对冗余列建索引
第四个问题,可以,但没啥必要,datetime类型提供一系列函数,换成其它类型的话如果用到日期计算功能就要自己写函数了。