建立索引常用的规则如下:

1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引
Oracle中我们经常使用Date字段类型记录日期和时间,有的时候还在这个字段上建立索引。
然后通过Java程序访问数据库的时候,我们很自然的类似这样使用:select * from table where endDate>? and endDate,然后通过PreparedStatement预编译,再通过setTimestamp传入由java.util.Date转成java.sql.Timestamp的参数(因为java.sql.Date只有日期,java.sql.Time只有时间,所以我们只能用java.sql.Timestamp类型)。我们会认为这样应该走索引区间扫描,效率应该是非常高的。
而事实上,Oracle会把sql解释成如下这样来执行:select * from table where TO_TIMESTAMP(endDate)>? and TO_TIMESTAMP(endDate); 为什么?因为传入的参数是timestamp类型,Oracle从9.2版本以后支持这种类型,所以Oracle做了这样的转换,结果就是这个SQL执行变成了全表扫描。我们做的试验,加了一个index hint,强制走时间索引字段,结果效率也不高,sql执行变成了全索引扫描,和全表扫描没多大区别。结果效率还是低。
不光直接使用JDBC会是这样,Spring,iBatis在处理传入参数是java.util.Date类型的时候,都会使用setTimestamp设定参数,所以都需要注意。
MySQL索引生效的时间是在执行查询时。当查询语句中包含索引列,并且索引列与查询条件相匹配时,MySQL会使用索引来加速查询操作。索引可以帮助MySQL快速定位符合查询条件的数据,提高查询性能。但是,如果查询语句中没有包含索引列或者索引列与查询条件不匹配,那么索引将不会起作用,MySQL将会进行全表扫描,性能会受到影响。
所以,编写合适的查询语句,包含适当的索引列,可以提高查询性能。
1 查询时间范围可以根据具体需求来确定,一般来说,根据业务需求和数据量大小,选择合适的时间范围可以提高查询效率。2 查询时间范围的选择可以根据数据库中的索引情况来确定。如果数据库中有适当的索引,可以根据索引字段进行范围查询,以减少查询时间。3 此外,还可以根据数据的时间分布情况来选择查询时间范围。如果数据的时间分布比较均匀,可以选择较大的时间范围进行查询;如果数据的时间分布不均匀,可以根据具体情况选择合适的时间范围进行查询。4 在进行时间范围查询时,还可以考虑使用数据库的时间函数来进行查询,例如使用"between"关键字来指定时间范围,或者使用"date_add"、"date_sub"等函数来进行时间计算。5 最后,为了提高查询效率,还可以对查询语句进行优化,例如合理使用索引、避免全表扫描等。