2012-07-14 3 views
1

나는 쿼리를 수행하는 데 필요한 약 3 천만 개의 레코드가있는 테이블을 가지고 있습니다. 저의 독서에서 필자는 필자가 선택해야하는 모든 필드에 맨 왼쪽 접두사를 사용하는 복합 인덱스가 올바른 방법이라고 생각했지만 쿼리에 대한 설명을 실행할 때 인덱스를 사용하지 않았습니다. 이들은인덱스를 사용하여이 쿼리를 최적화하는 가장 좋은 방법은 무엇입니까?

`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`email` varchar(255) NOT NULL DEFAULT '', 
`customer_id` int(10) unsigned DEFAULT NULL, 
`company_id` int(10) unsigned NOT NULL, 
`active` tinyint(1) unsigned NOT NULL DEFAULT '1',                                    
`date` date DEFAULT NULL 

인덱스이

PRIMARY KEY (`id`),                                                       
UNIQUE KEY `email` (`email`,`customer_id`),                                                 
KEY `customer_id` (`customer_id`,`company_id`,`active`,`date`) 
처럼 보이는 필드입니다

select distinct email FROM my_table 
WHERE `customer_id` IN(278,428,186,40,208,247,59,79,376,73,38,52,68,227) 
AND `company_id` = 4 
AND `active` = 1 
AND `date` > '2012-04-15'; 

은이

+----+-------------+--------+-------+---------------+-------+---------+------+----------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows  | Extra  | 
+----+-------------+--------+-------+---------------+-------+---------+------+----------+-------------+ 
| 1 | SIMPLE  | emails | index | customer_id | email | 772  | NULL | 29296705 | Using where | 
+----+-------------+--------+-------+---------------+-------+---------+------+----------+-------------+ 

같은 외모를 설명 :

쿼리입니다

이 방법을 최적화하는 가장 좋은 방법은 무엇인지 모르겠습니다.

+2

내게 최적화되어 있습니다. – Samson

+0

@radashk 쿼리는 3,117,636 개의 행만 반환합니다. 설명에서, 그것은 필터링해야 할 행이 약 3 천만 개가 있음을 보여줍니다. – Zach

+1

WHERE IN 절을 모두 사용합니다. 색인을 생성 할 수 없습니다. – Samson

답변

1

MySQL은 종종 인덱스 왼쪽에 IN에 대해 까다로워합니다. 각 customer_id에 대해 하나의 검색어를 시도하고 색인을 사용하는지 확인하십시오. UNION 구문을 사용하여 서로 결합 할 수 있습니다. 다른 가능성은 MySQL이 인덱스를 사용하는 것보다 10 %의 행에 대해 모든 것을 탐색하는 것이 더 빠르다는 것입니다.

+0

사실 그렇게했을 때 인덱스를 사용했습니다. 나는 힘 지수 (customer_id)를 수행하는 경우에도 설명에 630 만 가지만 표시된다는 것을 알게되었으며 이는 큰 발전입니다. – Zach

+0

두 번 쿼리를 실행하고 각 쿼리를 여러 번 실행합니다. MySQL은 인덱스를 사용하지 않는 것이 더 빠를 것이라고 생각합니다. –

+0

두 쿼리를 각각 5 번 실행하고 FORCE INDEX를 사용하면 확실히 개선됩니다. 원래 쿼리의 시간은 26.4, 25.4, 27.7, 25.1 및 25.5였습니다. FORCE INDEX 쿼리의 시간은 14.1, 14.3, 14.3, 13.9 및 14.9였습니다. – Zach

관련 문제