检查日期范围

时间:2017-04-07 12:36:29

标签: mysql date

用户将选择日期,例如2017年3月6日,我需要在2017年3月6日之前检索数十万条记录(但可能因用户选择而异)。

从上面的情况来看,我正在使用这个查询SELECT col from table_a where DATE_FORMAT(mydate,'%Y%m%d') < '20170306'我觉得这个记录有点慢。是否有更快或更快的方法来获得这样的日期结果?

2 个答案:

答案 0 :(得分:2)

如果要读取100,000条记录,DBMS可能会决定读取表记录以进行记录(全表扫描),并且您无法做很多事情。

另一方面,如果该表包含数十亿条记录,那么100,000只是一小部分,那么DBMS可能会决定使用索引。

无论如何,您至少应该让DBMS有机会通过索引进行选择。这意味着:首先创建一个索引(如果尚未存在)。

您可以单独在日期列上创建索引:

create index idx on table_a (mydate);

或甚至提供包含查询中使用的其他列的覆盖索引:

create index idx on table_a (mydate, col);

然后编写查询,以便直接访问日期列。您在DATE_FORMAT(mydate,'%Y%m%d')上没有索引,因此上述索引不会帮助您解决原始查询问题。您需要一个查询日期本身的查询:

select col from table_a where mydate < date '2017-03-06';

DBMS是否然后使用索引仍然由DBMS决定。它将尝试使用最快的方法,这仍然可以是全表扫描。

答案 1 :(得分:1)

如果在比较左侧的任何列中进行函数调用,MySql将进行全表扫描。

最快的方法是在mydate上创建索引,并使右侧('20170306')与列(和索引)的数据类型相同