日期:2014-05-16  浏览次数:20952 次

为什么我这句SQL代码,索引不起作用。
表:

DROP TABLE IF EXISTS `active`;
CREATE TABLE IF NOT EXISTS `active` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(10) unsigned NOT NULL,
  `lastactive` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `lastactive` (`lastactive`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

插入数据:

insert into active values
(null,10000, unix_timestamp("2012-08-20 15:10:02")),
(null,10001, unix_timestamp("2012-08-20 15:10:02")),
(null,10002, unix_timestamp("2012-08-20 15:10:03")),
(null,10003, unix_timestamp("2012-08-20 15:10:03")),
(null,10004, unix_timestamp("2012-08-20 15:10:03")),
(null,10005, unix_timestamp("2012-08-20 15:10:04")),
(null,10006, unix_timestamp("2012-08-20 15:10:04")),
(null,10007, unix_timestamp("2012-08-20 15:10:05")),
(null,10008, unix_timestamp("2012-08-20 15:10:06"))


explain
select * from active where lastactive > unix_timestamp()-3;

上面这句索引起作用。


但是我在测试中,因为插入的日期与我测试的当前日期相差不少时间。所以我改写为以下内容:

explain
select * from active where lastactive > unix_timestamp("2012-08-20 15:10:06") - 3;

但是数据显示,TYPE为ALL,key为NULL。也就是说索引不起作用。

我在改写以下语句测试:

explain
select * from active where lastactive > unix_timestamp("2012-08-20 15:10:06");

上面这个语句,索引又起作用了。

请了解这块内容的朋友帮忙解惑~万分感谢。

------解决方案--------------------
mysql认为走索引的代价比不用索引代价大

你可以看下unix_timestamp("2012-08-20 15:10:06") - 3;
unix_timestamp("2012-08-20 15:10:06") - 2;
unix_timestamp("2012-08-20 15:10:06") - 1;
unix_timestamp("2012-08-20 15:10:06") - 0;
unix_timestamp("2012-08-20 15:10:06") + 1 ;
------解决方案--------------------
当MYSQL认为符合条件的记录在30%以上,它就不会再使用索引。