1

クエリを実行する必要がある約 3,000 万レコードのテーブルがあります。私の読書から、選択する必要があるすべてのフィールドで左端のプレフィックスを使用する複合インデックスが正しい方法であると考えましたが、クエリで Explain を実行すると、インデックスを使用していません。

これはクエリです:

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`) 

これを最適化する最善の方法が何であるかはよくわかりません。

4

1 に答える 1

1

MySQL はINインデックスの左側にこだわることがよくあります。それぞれに対して 1 つのクエリを試してcustomer_id、それがインデックスを使用しているかどうかを確認してください。構文を使用してUNIONそれらを結合できます。もう 1 つの可能性は、MySQL が、行にインデックスを使用するよりも、行の 10% をすべてふるいにかける方が高速であると判断することです。

于 2012-07-14T21:54:35.533 に答える