5

最適化したいSELECTステートメントがあります。最適化によるmysql-orderは、場合によってはインデックスを使用してORDER BY. 具体的には次の点です。

キーの連続しない部分で ORDER BY を使用します
。 SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;

こういうこともあるんだな、と思わせてくれます。次のインデックスを使用しています。

UNIQUE KEY `met_value_index1` (`RTU_NB`,`DATETIME`,`MP_NB`),
KEY `met_value_index` (`DATETIME`,`RTU_NB`)

次の SQL ステートメントを使用します。

SELECT * FROM met_value
WHERE rtu_nb=constant
AND mp_nb=constant
AND datetime BETWEEN constant AND constant
ORDER BY mp_nb, datetime
  • インデックスを削除して、met_value_index1新しい順序で作成するRTU_NBだけで十分でしょうか?MP_NBDATETIME
  • RTU_NB をORDER BY句に含める必要がありますか?


結果: @meriton が提案したものを試し、 index を追加しましたmet_value_index2SELECT1.2 秒後に完了しましたが、以前は 5.06 秒後に完了していました。以下は質問に属していませんが、補足として: 他のいくつかの試行の後、エンジンを MyISAM から InnoDB に切り替え、rtu_nb, mp_nb, datetime主キーを使用して、0.13 秒後にステートメントが完了しました!

4

3 に答える 3

1

ORDER BY にインデックスを使用することはないと思います。ただし、実行計画を確認する必要があります。またはここ

于 2011-12-22T17:23:35.250 に答える
1

質問がわかりません。行が返されるために一致mp_np = constantする必要がある場合、返される行はすべて同じになるため、order by 句にmp_nb含めても効果はありません。mp_nb意味的に同等のステートメントを使用することをお勧めします。

SELECT * FROM met_value
WHERE rtu_nb=constant
AND mp_nb=constant
AND datetime BETWEEN constant AND constant
ORDER BY datetime

クエリオプティマイザーを不必要に混乱させないようにします。

さて、あなたの質問に: データベースは、基になるアクセスが適切な順序で行を返すことがわかっている場合、並べ替えなしで order by 句を実装できます。インデックスの場合、where 句で一致した行が order by 句で要求された順序でインデックスに表示される場合、インデックスが並べ替えを支援できることを意味します。

この場合、データベースは実際にmet_value_index1の行に対してインデックス レンジ スキャンを実行し、これらの行のそれぞれについてrtu_nb=constant AND datetime BETWEEN constant AND constantかどうかを確認できますが、選択性が高いmp_nb=constant場合は、必要以上に多くの行を確認することになります。mp_nb=constant別の言い方をすれば、一致する行がインデックス内で連続している場合、インデックスは最も有用です。これは、インデックス レンジ スキャンが実際に返される必要がある行のみに触れることを意味するためです。

したがって、このクエリには次のインデックスがより役立ちます。

UNIQUE KEY `met_value_index2` (`RTU_NB`,`MP_NB`, `DATETIME`),

一致するすべての行がインデックス内で隣り合っており、行はorder by句が要求する順序でインデックスに表示されるためです。クエリ オプティマイザがそれを取得できるほどスマートかどうかはわかりません。そのため、実行計画を確認する必要があります。

于 2011-12-22T22:37:12.153 に答える
0

WHERE句に表示されるフィールドの順序は、インデックスの順序と一致する必要があります。したがって、現在のクエリでは、rtu_nb、mp_nb、datetimeの順序でフィールドを持つ1つのインデックスが必要です。

于 2011-12-22T17:22:16.873 に答える