Mysql 检查日期范围时的最快结果
用户将选择一个日期,例如2017年3月6日,我需要检索2017年3月6日之前的十万条记录(但可能会因用户选择而有所不同)Mysql 检查日期范围时的最快结果,mysql,date,Mysql,Date,用户将选择一个日期,例如2017年3月6日,我需要检索2017年3月6日之前的十万条记录(但可能会因用户选择而有所不同) 从上面的例子中,我使用这个查询SELECT col From table_a where DATE_FORMAT(mydate,%Y%m%d')
从上面的例子中,我使用这个查询
SELECT col From table_a where DATE_FORMAT(mydate,%Y%m%d')<'20170306'
我觉得记录有点慢。有没有更快或最快的方法来获得这样的日期结果?如果在比较左侧的任何列中进行函数调用,MySql将进行完整的表扫描
最快的方法是在mydate上创建索引,并使右侧('20170306')与列(和索引)的数据类型相同。如果在比较左侧的任何列中进行函数调用,MySql将进行完整的表扫描
最快的方法是在
mydate
上创建一个索引,并使右侧('20170306')与列(和索引)的数据类型相同要读取100000条记录,DBMS可能会决定逐个记录地读取表记录(完整表扫描),而您也无能为力
另一方面,如果表包含数十亿条记录,那么100000条记录只是一小部分,那么DBMS可能会决定使用索引
无论如何,您至少应该让DBMS有机会通过索引进行选择。这意味着:首先创建一个索引(如果还不存在的话)
您可以仅在日期列上创建索引:
create index idx on table_a (mydate);
甚至还可以提供包含查询中使用的其他列的覆盖索引:
create index idx on table_a (mydate, col);
然后编写查询,以便直接访问日期列。您没有关于DATE\u格式(mydate,%Y%m%d')
的索引,因此上述索引对原始查询没有帮助。您需要一个查询来查找日期本身:
select col from table_a where mydate < date '2017-03-06';
从表a中选择列,其中mydate<日期'2017-03-06';
DBMS是否使用索引仍然取决于DBMS。它将尝试使用最快的方法,这很可能仍然是全表扫描。由于要读取100000条记录,DBMS可能会决定逐个记录地读取表记录(全表扫描),而您也无能为力 另一方面,如果表包含数十亿条记录,那么100000条记录只是一小部分,那么DBMS可能会决定使用索引 无论如何,您至少应该让DBMS有机会通过索引进行选择。这意味着:首先创建一个索引(如果还不存在的话) 您可以仅在日期列上创建索引:
create index idx on table_a (mydate);
甚至还可以提供包含查询中使用的其他列的覆盖索引:
create index idx on table_a (mydate, col);
然后编写查询,以便直接访问日期列。您没有关于DATE\u格式(mydate,%Y%m%d')
的索引,因此上述索引对原始查询没有帮助。您需要一个查询来查找日期本身:
select col from table_a where mydate < date '2017-03-06';
从表a中选择列,其中mydate<日期'2017-03-06';
DBMS是否使用索引仍然取决于DBMS。它将尝试使用最快的方法,这很可能仍然是全表扫描。mydate是数据库中的一列,还是来自外部的值(用户输入)?mydate是数据库中的一列。值“20170306”来自用户输入。mydate是数据库中的一列,还是来自外部(用户输入)的值?mydate是数据库中的一列。值“20170306”来自用户输入。将右侧(“20170306”)设置为列的相同数据类型是什么意思?您的意思是我需要将('20170306')格式化为varchar/integer/date?您的意思是
使右侧('20170306')与列的数据类型相同
?您的意思是我需要将('20170306')格式化为varchar/integer/date?