나는 쿼리를 수행하는 데 필요한 약 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 |
+----+-------------+--------+-------+---------------+-------+---------+------+----------+-------------+
같은 외모를 설명 :
이
쿼리입니다이 방법을 최적화하는 가장 좋은 방법은 무엇인지 모르겠습니다.
내게 최적화되어 있습니다. – Samson
@radashk 쿼리는 3,117,636 개의 행만 반환합니다. 설명에서, 그것은 필터링해야 할 행이 약 3 천만 개가 있음을 보여줍니다. – Zach
WHERE IN 절을 모두 사용합니다. 색인을 생성 할 수 없습니다. – Samson