私は値がテーブルの最大値と最小値の間にあるかどうかをチェックするSQLクエリを持っています。次のように私は今、これを実装しました:私は凸包から4回、私はこのクエリを実行するたびに選択していますので、これは、非常にゆっくりと実行されているmin()とmax()の効率的な使い方は?
SELECT spectrum_id, feature_table_id
FROM 'spectrum', 'feature'
WHERE `spectrum`.msrun_msrun_id = 1
AND `feature`.msrun_msrun_id = 1
AND (SELECT min(rt) FROM `convexhull` WHERE `convexhull`.feature_feature_table_id = `feature`.feature_table_id) <= scan_start_time
AND scan_start_time <= (SELECT max(rt) FROM `convexhull` WHERE 'convexhull'.feature_feature_table_id = 'feature'.feature_table_id)
AND (SELECT min(mz) FROM `convexhull` WHERE `convexhull`.feature_feature_table_id = `feature`.feature_table_id) <= base_peak_mz
AND base_peak_mz <= (SELECT max(mz) FROM `convexhull` WHERE `convexhull`.feature_feature_table_id = `feature`feature_table_id)
、私はインナーを使用してそれを改善しようとした参加:
SELECT spectrum_id, feature_table_id
FROM 'spectrum', 'feature'
INNER JOIN `convexhull` ON `convexhull`.feature_feature_table_id = `feature`.feature_table_id
WHERE `spectrum`.msrun_msrun_id = ? "+
AND `feature`.msrun_msrun_id = ? "+
AND min(`convexhull`.rt) <= scan_start_time "+
AND scan_start_time <= max(`convexhull`.rt) "+
AND min(`convexhull`.mz) <= base_peak_mz "+
AND base_peak_mz <= max(`convexhull`.mz)", spectrumFeature_InputValues)
ただし、min()およびmax()ステートメントはselectステートメントの後にのみ使用できます。どのようにして最初のクエリをより効率的にすることができるので、4つのクエリを実行せずに最小および最大のrtおよびmzを得ることができますか?
あなたが書いたトップ部分のテストが終わったばかりで、約3倍の速さで検索できました。ありがとう! –
データがまだ正しい限り;-) – gordatron