2012-10-15 50 views
3

我有一个表如下:Mysql索引没有使用

desc log;

+-------------------+-------------------------------+------+-----+-------------------+-------+ 
| Field    | Type       | Null | Key | Default   | Extra | 
+-------------------+-------------------------------+------+-----+-------------------+-------+ 
| time    | timestamp      | NO | MUL | CURRENT_TIMESTAMP |  | 
| severity   | enum('0','1','2','3','4','5') | NO |  | 1     |  | 
| user_id   | bigint(20)     | YES | MUL | NULL    |  | 
| user_ip   | varchar(15)     | YES | MUL | NULL    |  | 
| module   | varchar(30)     | NO |  | NULL    |  | 
| message   | text       | NO |  | NULL    |  | 
| blog_id   | bigint(20)     | NO | MUL | NULL    |  | 
| event_type  | varchar(255)     | YES | MUL | NULL    |  | 
| post_id   | bigint(20)     | YES |  | NULL    |  | 
| data    | longtext      | YES |  | NULL    |  | 
| data_integer  | tinyint(4)     | YES |  | NULL    |  | 
| data_integer_type | varchar(100)     | YES |  | NULL    |  | 
+-------------------+-------------------------------+------+-----+-------------------+-------+ 

表有以下指标:

show indexes from log; 
+-------------+------------+----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table  | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+-------------+------------+----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| log |   1 | log_event_type_idx |   1 | event_type | A   |   30 |  NULL | NULL | YES | BTREE  |   | 
| log |   1 | log_user_id_idx |   1 | user_id  | A   |  10938 |  NULL | NULL | YES | BTREE  |   | 
| log |   1 | log_blog_id_idx |   1 | blog_id  | A   |  24064 |  NULL | NULL |  | BTREE  |   | 
| log |   1 | log_user_ip_idx |   1 | user_ip  | A   |  24064 |  NULL | NULL | YES | BTREE  |   | 
| log |   1 | log_time_idx  |   1 | time  | A   |  240647 |  NULL | NULL |  | BTREE  |   | 
+-------------+------------+----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 

当我查询八月九月或数据,它使用了索引和工作正常。但对于Oct数据,它不使用索引。在表中最大日期是'2012-10-15'。 我添加了解释计划。

explain 
select * 
from log 
where time >= '2012-08-01 00:00:00' AND time < '2012-09-01 00:00:00' 

+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+ 
| id | select_type | table  | type | possible_keys  | key     | key_len | ref | rows | Extra  | 
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+ 
| 1 | SIMPLE  | log | range | log_time_idx | log_time_idx | 4  | NULL | 57306 | Using where | 
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+ 
1 row in set (0.04 sec) 

explain 
select * 
from log 
where time >= '2012-09-01 00:00:00' AND time < '2012-10-01 00:00:00' 

+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+ 
| id | select_type | table  | type | possible_keys  | key     | key_len | ref | rows | Extra  | 
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+ 
| 1 | SIMPLE  | log | range | log_time_idx | log_time_idx | 4  | NULL | 42569 | Using where | 
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+ 

explain 
select * 
from log 
where time >= '2012-10-01 00:00:00' AND time < '2012-11-01 00:00:00' 

+----+-------------+-------------+------+----------------------+------+---------+------+--------+-------------+ 
| id | select_type | table  | type | possible_keys  | key | key_len | ref | rows | Extra  | 
+----+-------------+-------------+------+----------------------+------+---------+------+--------+-------------+ 
| 1 | SIMPLE  | log | ALL | log_time_idx | NULL | NULL | NULL | 481300 | Using where | 
+----+-------------+-------------+------+----------------------+------+---------+------+--------+-------------+ 

你有什么想法是什么问题?我正在使用Mysql 5.1.48。

+0

这两天之间你有什么价值吗? – jcho360

+0

是的。我有。可能是299011记录。 – AIR

+0

我想'OPTIMIZE TABLE'或'ANALYZE TABLE'确保索引统计是最新的。它可能是冗长的操作,因此请在检查文档之前执行此操作(http://dev.mysql.com/doc/refman/5.0/en/optimize-table.html) – a1ex07

回答

0

MySQL似乎不喜欢高基数的范围。当使用DATETIME值时,它会很快显示出来。

您可以通过将DATE列添加到查询的表中来减少基数。基数将低得多,并且MySQL将更有可能使用该索引。