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