2

いくつかの特定の日付に一致するすべての行についてテーブルをクエリしようとしています。日付は連続しておらず、日付範囲全体のデータを返すことは望ましくありません。特定の日付の数は非常に多く、数百になる可能性があります。フィールドはインデックス化されているDateので、それを利用したいと思います。

フィールドを文字列に変換Dateし、文字列の比較でクエリを実行すると、少し怠惰でパフォーマンスが低下し、インデックスが破棄されます。このようなもの(以下)は正しく機能しますが、パフォーマンスとテーブルのスキャンについて懸念しています。

SELECT Date,Time,Open,High,Low,Close,Volume FROM minuteBarTable 
WHERE DATE(Date) IN ('2004-07-13','2011-09-01','2007-12-12');

' OR 'のブロックを使用すると、正しい効果と正しい結果が得られますが、よりエレガントでスケーラブルなアプローチを見つけたいと思います。何百もの日付で少し扱いに​​くくなる可能性があります。

SELECT Date,Time,Open,High,Low,Close,Volume FROM minuteBarTable 
WHERE Date='2004-07-13' OR Date='2011-09-01' OR Date='2007-12-12';

ここでは、「 OR 」のブロックがより効率的なアプローチですか?

4

1 に答える 1

4

上記の2つのSQLを組み合わせます。

SELECT Date,Time,Open,High,Low,Close,Volume FROM minuteBarTable 
WHERE Date IN ('2004-07-13','2011-09-01','2007-12-12');

このようにして、MySQLはのインデックスを使用できますDate。また、(O'ReillyのHigh Performance MySQLによると)クエリオプティマイザがリスト内の引数を並べ替えるため、IN通常は複数のsよりも優れているため、インデックス内の結果をすばやく見つけることができます(これも並べ替えられます)。ORIN

于 2012-07-11T15:03:43.790 に答える