select * from tableName where data_date >= '" + start_date + "' and data_date <= '" + end_date + "' and meter_id = '" + meter_id + "' order by data_date asc
在进行数据库中Date类型和日期格式的字符串进行比较时, 在数据库表设计中日期类型具有索引的情况下 , mysql的查询操作还会不会依赖索引呢?
带着这个问题看了很多博客. 归纳了一下, 给自己记录下来.
首先 , mysql在比较不同格式的数据时, 需要先将不同格式的数据转成同一格式的数据进行比较. 那么现在情况就分为两种.
1: 将日期格式的字符串转为日期类型再进行比较 (String -> Date)
2: 将日期类型转为字符串类型再和日期格式的字符串进行比较. ( Date -> String )
在Mysql 中, 是先将 String 转为Date , 即先将日期格式的字符串转为Date, 然后在对两个Date进行比较.
我猜这是因为表结构中日期是Date类型, Mysql需要将待比较的类型转成和数据库表字段相同的类型再进行比较.
其比较时间长度排序为:
字符串间的比较 < 日期类型的比较 < 日期和字符串的比较
在pgsql中,如果sql语句中对表字段加 函数,则这个字段的索引不走, 但是对传来的参数加函数,不影响走不走字段索引的事情.
所以, 查询时可以把传入的参数用函数转成和表字段对应的类型 ,但是不要在表字段上加函数. 在表字段上加函数, 如果表字段有索引, 那这个索引就不走了.
使用FORMAT_DATE函数时 , Date列的索引不起作用. 在Mysql中, 凡是使用了函数的列 , 都不会依赖索引比较.
如果表中date字段是Date类型并且加了索引的话, 使用日期格式的字符串和date进行比较, Mysql会把字符串先转成日期格式, 这时日期的date是有索引的 , 所以查询依然高效. 但如果使用FORMAT_DATE函数, 则date上的索引失效.
以上只是自己的理解, 不一定正确. 如果大佬们有不同的理解, 欢迎评论下留言.