2012-10-15 3 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  |   | 
+-------------+------------+----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 

I 8 월 또는 9월에 대한 데이터를 조회하고,이 인덱스를 사용하고 잘 작동합니다. 그러나 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은 인덱스를 더 많이 사용하게 될 것이다.

관련 문제