2016-05-04 5 views
1

MySQLテーブルの2つのdatetime列を比較または操作すると、かなり重大なパフォーマンス上の問題が発生します。私は約1,100万行のテーブルtblを持っています。MySQLはdatetime列のインデックスを無視しているようです

`id` int(11) NOT NULL AUTO_INCREMENT, 
`last_interaction` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', 
`last_maintenence` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', 
PRIMARY KEY (`id`), 
KEY `last_maintenence_idx` (`last_maintenence`), 
KEY `last_interaction_idx` (`last_interaction`), 
ENGINE=InnoDB AUTO_INCREMENT=12389814 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

私はこのクエリを実行すると、それが実行する分程度かかり:クエリを記述

SELECT id FROM tbl 
WHERE last_maintenence < last_interaction 
ORDER BY last_maintenence ASC LIMIT 200; 

がこれをレンダリング:

  id: 1 
    select_type: SIMPLE 
     table: tbl 
     type: index 
possible_keys: NULL 
      key: last_maintenence_idx 
     key_len: 5 
      ref: NULL 
     rows: 200 
     Extra: Using where 

それがどのように見えるそれは次のようになりますMySQLはlast_interactionのインデックスを検索/使用していません。それがなぜ起こるのか、どのようにそれを引き起こすのか誰にも分かりますか?

答えて

1

これは、通常、mysqlがテーブルごとに1つのインデックスしか使用しないためです。残念ながらあなたのクエリは単純なものに見えますが。解決策は、両方の列を含む複合インデックスを作成することです。

+0

正解ありがとうございました。 – Matt

+0

助けてうれしいです。 – e4c5

1

あなたが提供するクエリにはフルテーブルスキャンが必要です。 各レコードは、条件last_maintenence < last_interactionに一致するようにチェックする必要があります。 したがって、検索時にインデックスは使用されません。

インデックスlast_maintenence_idxは、その結果を注文したい場合にのみ使用されます。

1

ザッツ簡単:間違いありません。1.

MySQLは唯一の(主に)クエリごとに1つのインデックスを使用することができますし、オプティマイザが使用するための優れている1になります。

したがって、両方のフィールドを持つ複合インデックスを作成する必要があります。

+0

正解ありがとうございました。私はあなたをアップビューしましたが、e4c5が正しい答えとして受け入れられました。なぜなら彼は最初だったからです。 – Matt

関連する問題