MySQL-mysql的索引使用问题

MySQL-mysql的索引使用问题

泛泛之交 发布于 2017-08-27 字数 261 浏览 1204 回复 2

表的结构是这样的

CREATE TABLE `abc` (
`log_date` date NOT NULL ,
`pId` int(11) NOT NULL,
`sid` int(11) unsigned NOT NULL
KEY `sid` (`sid`,`log_date`,`pId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

想挽留 2017-11-09 2 楼

数据库到底使不使用索引,mysql会自行比较判断。

比如你第一个sql,是一个时间判定等与不等,数据库觉得不用索引更快些。如果还是要走索引的话 FORCE INDEX就行了。
而你第二条sql是一个时间范围,数据库认为走索引效率相对较高,

瑾兮 2017-10-14 1 楼

不是这样的.
你之所以看到Impossible WHERE noticed after reading const tables, 是因为
log_date = date_sub(now(),INTERVAL 3 MONTH) 这个条件永远是假的.

我建了数据库, 插入10w条数据.

mysql> explain select * from abc where
-> sid=123 and
-> log_date = date_sub(now(),INTERVAL 3 MONTH);
+----+-------------+-------+------+---------------+------+---------+------+-----
-+-----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows
| Extra |
+----+-------------+-------+------+---------------+------+---------+------+-----
-+-----------------------------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL
| Impossible WHERE noticed after reading const tables |
+----+-------------+-------+------+---------------+------+---------+------+-----
-+-----------------------------------------------------+
1 row in set (0.00 sec)

mysql> explain select * from abc where
-> sid=123 and
-> log_date = str_to_date('17, 04, 2013', '%d, %m, %Y');
+----+-------------+-------+------+---------------+---------+---------+---------
----+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref
| rows | Extra |
+----+-------------+-------+------+---------------+---------+---------+---------
----+------+--------------------------+
| 1 | SIMPLE | abc | ref | sid_key | sid_key | 7 | const,co
nst | 1 | Using where; Using index |
+----+-------------+-------+------+---------------+---------+---------+---------
----+------+--------------------------+
1 row in set (0.00 sec)

下面这条查询也是判断log_date 等于某个值, 使用了索引.