我有一張需要執行查詢的約3000萬條記錄。從我的閱讀中,我認爲使用最左前綴與我需要選擇的所有字段的組合索引是正確的方法,但是當我在查詢上運行解釋時,甚至不使用索引。使用索引優化此查詢的最佳方式是什麼?
這是查詢:
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 |
+----+-------------+--------+-------+---------------+-------+---------+------+----------+-------------+
這些領域
`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`)
我不太確定優化這個的最佳方法是什麼。
它看起來優化了我.. – Samson 2012-07-14 20:01:01
@radashk該查詢只返回3,117,636行。在解釋中,它表明它有將近3000萬行需要過濾。 – Zach 2012-07-14 20:13:19
這些都是您使用WHERE IN子句的所有情況。它不能索引。 – Samson 2012-07-14 20:15:14