用户将选择日期,例如2017年3月6日,我需要在2017年3月6日之前检索数十万条记录(但可能因用户选择而异)。
从上面的情况来看,我正在使用这个查询SELECT col from table_a where DATE_FORMAT(mydate,'%Y%m%d') < '20170306'
我觉得这个记录有点慢。是否有更快或更快的方法来获得这样的日期结果?
答案 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')与列(和索引)的数据类型相同