5

私はかなり単純なテーブル構造のように見えますが、MySQL はindex_merge単純なクエリで最適とは言えないデフォルトを設定しています。

テーブル構造は次のとおりです。

CREATE TABLE IF NOT EXISTS `event_log` (
  `event_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(5) DEFAULT NULL,
  `location_id` int(10) DEFAULT NULL,
  `object_id` int(5) DEFAULT NULL,
  `action_id` int(5) DEFAULT NULL,
  `date_event` datetime DEFAULT NULL,
  PRIMARY KEY (`event_id`),
  KEY `user_id` (`user_id`),
  KEY `date_event` (`date_event`),
  KEY `action_id` (`action_id`),
  KEY `object_id` (`object_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

基本的な SELECT クエリの EXPLAIN

EXPLAIN SELECT date_event
FROM event_log
WHERE user_id =123
AND object_id =456
AND location_id =789 

これを返します:

select_type  table     type         possible_keys       key                 key_len     ref     rows    Extra
SIMPLE       event_log index_merge  user_id,object_id   object_id,user_id   5,5         NULL    27      Using intersect(object_id,user_id); Using where

読みやすくするために、エクストラビットを次に示します。

Using intersect(object_id,user_id); Using where

MySQL がこのクエリで標準インデックスを使用しないのはなぜですか? と が交差user_idしているのはなぜobject_idですか?

4

1 に答える 1

11

クエリの最も効果的なインデックスは、3 つのフィールドすべてを含む複合インデックスです。たとえば、(object_id, user_id, location_id). そのようなインデックスがないため、MySQL は既存のインデックスからほとんどの情報を取得するために最善を尽くします。

于 2013-04-29T16:42:33.827 に答える