2016-12-08 5 views
1

は私のテーブルです:>演算子がある場合、どのようなインデックスが必要ですか?ここ

// mytable 
+----+---------+-------------+ 
| id | user_id | unix_time | 
+----+---------+-------------+ 
| 1 | 324435 | 1481199265 | 
| 2 | 745645 | 1481194241 | 
| 3 | 547346 | 1481291987 | 
+----+---------+-------------+ 

そして、これは私の現在の複合インデックスです:

mytable(user_id, unix_time) 

そして、これが私のクエリのいずれかです。

DELETE FROM mytable WHERE unix_time < unix_timestamp(subdate(now(), interval '1' YEAR)) 

私がしましたどこかで読んでください:

演算子が>または<またはBETWEENまたは>=または<=の場合、その列は複合インデックスの最後の列である必要があります。

だから、あなたが見るように、そこに<オペレータの両方があるとunix_timeは私の現在のインデックス(私は上記の理由別のクエリのインデックスを作成しました) ...今私は、どちらかを知りたいの最後のいずれかになります。

  • 私は、クエリの利益のためにmytable(unix_time)のような1つの以上のインデックスを作成する必要がありますかについて

それとも

  • 引用文は右ではないと

上記のクエリのための他の任意のインデックスに必要?

+0

これは、unix_timeがコンポジットインデックスに記載されている最後のフィールドであるようです。そのため、私はその質問を理解できません。エラーが出ていますか? – RiggsFolly

+0

@RiggsFollyいいえ、エラーはありません。知りたいだけですが、別のインデックスまたは現在のインデックスを作成する必要がありますか? –

+0

私は本当にあなた自身の質問に答えたと確信しています。それが正しいとすれば – RiggsFolly

答えて

1

私は、クエリ

はいの利益のためにmytableは(UNIX_TIME)のような1つの以上のインデックスを作成する必要があります。それは問題の<対かまたは=ではありません。これは、どの列がインデックスにあり、どの順番であるかです。あなたは

DELETE FROM mytable 
WHERE unix_time < unix_timestamp(subdate(now(), interval '1' YEAR)) 
    AND user_id=123456 

をしていた場合は、その後のuser_id + UNIX_TIME上のインデックスは慣れるでしょう

。また、既存の索引がuser_id + unix_timeではなくunix_time + user_idにあった場合、データベースはそれを使用できます。

そして、はい、これは正確である:

がある>または<またはBETWEENまたは> =または< =演算子、その列がコンポジット索引の最後の1でなければなりません。

この場合、user_idでも選択していなかったので、問題はありませんでした。

1

クエリの計画のみがクエリを実行する方法を示します。しかし、unix_timeは2番目のフィールドなので、そのクエリのインデックスが不正です。そのクエリのための良い指標は

mytable(unix_time, user_id) 

または

mytable(unix_time) 

だけクエリプランあり、それを使用するかどうかを示します。

関連する問題