Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 检查日期范围时的最快结果_Mysql_Date - Fatal编程技术网

Mysql 检查日期范围时的最快结果

Mysql 检查日期范围时的最快结果,mysql,date,Mysql,Date,用户将选择一个日期,例如2017年3月6日,我需要检索2017年3月6日之前的十万条记录(但可能会因用户选择而有所不同) 从上面的例子中,我使用这个查询SELECT col From table_a where DATE_FORMAT(mydate,%Y%m%d')

用户将选择一个日期,例如2017年3月6日,我需要检索2017年3月6日之前的十万条记录(但可能会因用户选择而有所不同)


从上面的例子中,我使用这个查询
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?