私は約600.000エントリのテーブルを持っています。テーブルは:MySQLが主キーオーバーインデックスを選択しています
私は(start、end、room_id)でインデックスを作成しました。これはSELECTクエリに大きなパフォーマンスをもたらしました。しかし、今、私は次のクエリを実行している:
update vacancies
set locked = 1
where start >= '2017-11-28 22:00:00'
and end <= '2017-11-28 23:00:00'
and (room_id = 1234
or room_id in (select other_room
from room_dependencies
where first_room = 1234))
私はこのクエリは、それが(〜1.5秒)をやっていることのために時間のかなり多くを取ると信じています。私は、MySQL上でEXPLAINコマンドを実行し、それが次のように返さ:
(私は(はるかに)DBの専門家ではないが、私はこのクエリは、全表スキャンを実行していたことを奇妙だと思ったFTS )を使用する代わりに、INDEX(start、end、room_id)を使用します。どうやら、それは実行可能なキーとして "開始"を識別し、それを無視して、PRIMARY KEYを選択し、FTSを実行します。そこで、私はthis answerに続き、PRIMARY KEYを削除し、新しいPRIMARY KEYとして(start、end、room_id)を追加しましたが、結果はまったく同じ(または最悪の場合もありました)。
これは、プラットフォーム上の他のアクションの直後に実行する必要がある単一の要求です。キューに入れて遅延形式で更新された他のバッチとして実行することは不可能です。
このクエリのパフォーマンスを向上させる方法は他にありますか?
ありがとうございます!
他の選択肢はどのように見えますか?通常、複数列の索引の最後に範囲が必要な列を指定します(room_id、start、end)。私はそれを望んでいるか、room_idのインデックスだけを追加したいと思う。あるいは、単に '空き状況の更新がインデックス(開始)セットを使用する... 'と言うだけで十分です。 – ysth
(tinyintの意味がない場合は '1') – Strawberry
開始時刻> = '2017-11-28 22:00:00'の行の数はいくつですか?'どこでスタート> = '2017-11-28 22:00:00'を試して、<2017-11-28 23:00:00 'を開始し、<=' 2017-11-28 23:00:00に終了しましたか? 'AND ...'?オプティマイザは、目的の終了時刻の後に開始する行を排除できることを直観的に理解していません。 –