Mysql索引未使用
我的表格如下: 描述日志Mysql索引未使用,mysql,Mysql,我的表格如下: 描述日志 +-------------------+-------------------------------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------+--------------------------
+-------------------+-------------------------------+------+-----+-------------------+-------+
| 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 | |
+-------------+------------+----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
当我查询八月或九月的数据时,它使用索引,工作正常。但对于十月数据,它不使用指数。表中的最长日期为“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 |
+----+-------------+-------------+------+----------------------+------+---------+------+--------+-------------+
解释
挑选*
从日志
其中时间>='2012-08-01 00:00:00'和时间<'2012-09-01 00:00:00'
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+
|id |选择|类型|类型|可能的|键|键|列|参考|行|额外|
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+
|1 |简单|日志|范围|日志|时间| idx |日志|时间| idx | 4 |空| 57306 |使用where|
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+
一组1行(0.04秒)
解释
挑选*
从日志
其中时间>='2012-09-01 00:00:00'和时间<'2012-10-01 00:00:00'
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+
|id |选择|类型|类型|可能的|键|键|列|参考|行|额外|
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+
|1 |简单|日志|范围|日志|时间| idx |日志|时间| idx | 4 |空| 42569 |使用where|
+----+-------------+-------------+-------+----------------------+----------------------+---------+------+-------+-------------+
解释
挑选*
从日志
其中时间>='2012-10-01 00:00:00'和时间<'2012-11-01 00:00:00'
+----+-------------+-------------+------+----------------------+------+---------+------+--------+-------------+
|id |选择|类型|类型|可能的|键|键|列|参考|行|额外|
+----+-------------+-------------+------+----------------------+------+---------+------+--------+-------------+
|1 |简单|日志|所有|日志|时间| idx | NULL | NULL | NULL | 481300 |使用where|
+----+-------------+-------------+------+----------------------+------+---------+------+--------+-------------+
你知道问题出在哪里吗?我正在使用Mysql 5.1.48。Mysql似乎不喜欢具有高基数的范围。当使用
DATETIME
值时,这会很快显示出来
您可以通过向查询表中添加
DATE
列来减少基数。基数将大大降低,MySQL将更有可能使用索引。在这两天之间你有什么值吗?是的。我有。可能是299011条记录。我会尝试优化表
或分析表
,以确保索引统计数据是最新的。这可能是一个冗长的操作,所以在执行之前检查文档()我使用了这些命令,但仍然是一样的。我不知道。看看这里: