Mysql 如何在查询之间使用索引

Mysql 如何在查询之间使用索引,mysql,indexing,Mysql,Indexing,当我使用Between命令进行查询时,如何使索引工作 当我解释这个问题时: explain select * from table where Date between date1 and date2; 要使用的返回实际键是NULL,在这种情况下如何使用我的索引 我读过一些MYSQL的文档,他们说这里应该使用BTree索引,以便进行>UNIX_时间戳(date1)和DateInuNixTimestamp格式

当我使用Between命令进行查询时,如何使索引工作

当我解释这个问题时:

explain select * from table where Date between date1 and date2;
要使用的返回实际键是
NULL
,在这种情况下如何使用我的索引

我读过一些MYSQL的文档,他们说这里应该使用BTree索引,以便进行><或查询之间的查询,但在我的情况下它不起作用

请帮忙

编辑

explain  select * from table where Date between '2010-05-10 00:00:00' and '2010-06-10 00:00:00';
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+

| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+

|  1 | SIMPLE      | table| ALL  | date_index    | NULL | NULL    | NULL | 109024 | Using where |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+

您必须将表锁定类型设置为“所有页面”

之后,必须在该列上创建索引(如果可以创建聚集索引)

那跑

sp_recompile [table]
go

最后再看看你的q计划。它应该使用索引。

您正在比较datetime字段和大于/小于比较中的字符串。如果您使用cast或函数(如UNIX_TIMESTAMP())并将其他日期也转换为unixtimestamp,这将起到作用,但会破坏索引的使用。也许更好的解决方案是将日期存储为表中的unix时间戳,并在其上放置索引。然后,您只需要执行以下操作:

select * 
from table 
where DateInUnixTimeStampFormat 
between UNIX_TIMESTAMP(date1) and UNIX_TIMESTAMP(date2)

选择*
从桌子上
其中DateInUnixTimeStampFormat
>UNIX_时间戳(date1)和DateInuNixTimestamp格式
您在
日期
列上有索引吗?另外,
SELECT*
可以强制进行完整的表扫描。是的,我有日期列索引和usign BTREE索引,但它不起作用。您的日期列是实际的日期类型吗?你在where条款中限制了多少?如果您的where覆盖了大部分数据,那么索引就没有什么用处了。此外,使用此查询发布EXPLAINUsing的输出是相同的。NULLYes中使用的实际索引如果更改为UnixTimeStamp,它将起作用。但是我更喜欢使用datetime数据类型,因此我尝试使用STR_TO_DATE(“(2010-3-31 16:24)”,(%Y-%c-%e%H:%i)”将其转换为datetime,但仍然不起作用,请建议我需要更多地了解您的用例。你总是只需要限制白天的时间吗(我看到你使用00:00:00的时间)?或者是在任何日期和任何时间之间?您是否正在使用此查询的结果进行另一个联接?所有的结果是否都包含特定的时间,我的意思是,以分钟、秒等为单位,或者是以特定的间隔,比如每五分钟一次?
sp_recompile [table]
go
select * 
from table 
where DateInUnixTimeStampFormat 
between UNIX_TIMESTAMP(date1) and UNIX_TIMESTAMP(date2)
select * 
from table 
where DateInUnixTimeStampFormat 
> UNIX_TIMESTAMP(date1) and DateInUnixTimeStampFormat < UNIX_TIMESTAMP(date2)