如何在查询之间使用索引

时间:2010-08-27 07:43:45

标签: mysql indexing

当我使用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 |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+

2 个答案:

答案 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计划。它应该使用索引。