当我使用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 |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
答案 0 :(得分:0)
您正在将datetime字段与greater_than / less_than比较中的字符串进行比较。如果您使用强制转换或函数(如UNIX_TIMESTAMP())并将其他日期转换为unixtimestamp,那将会解决问题,但会破坏索引的使用。也许更好的解决方案是将日期作为unix时间戳存储在表中并在其上放置索引。然后,您只需要这样做:
select *
from table
where DateInUnixTimeStampFormat
between UNIX_TIMESTAMP(date1) and UNIX_TIMESTAMP(date2)
OR
select *
from table
where DateInUnixTimeStampFormat
> UNIX_TIMESTAMP(date1) and DateInUnixTimeStampFormat < UNIX_TIMESTAMP(date2)
答案 1 :(得分:-1)
您必须将表锁定类型设为“ AllPages ”;
alter table [table] lock allpages
go
之后,您必须在该列上创建索引(如果您可以创建聚簇索引);
create nonclustered index ndx1 on [table] (col1, ...)
go
运行;
sp_recompile [table]
go
最后再看看你的q计划。它应该使用索引。