0

かなり最適化されたクエリがあります。ただし、この結合を追加すると、クエリが 70 秒増加します。私が見ることができる最大の問題は、同じ日付に基づいて 2 つの日時を互いに比較する必要があることです。つまり、2013-01-01 8:37am は 2013-01-01 9:01am に結合する必要があります。したがって、まず両方を日付に変換してから比較します。

テーブルを変更せずにこれを行うより速い方法はありますか? 以下の結合のすべてのフィールドにインデックスを追加しました。

LEFT JOIN ins ON 
DATE(ins.ins_date) = DATE(r.date) 

更新: 日付から数時間を減算し、日付を直接比較するなど、いくつかの異なるトリックを試すことになり、少なくとも1つのインデックスが活用され、結合にさらに基準を追加すると、DATE() を実行しようとするレコードを減らすのに役立ちます操作オン。下のポスターにも、日付用に別のフィールドを作成するという有効な提案があったと思いますが、この場合のテーブルを変更することはできませんが、将来これを試すかもしれません.

4

1 に答える 1

1

あなたが私たちに示した結合ステートメントでは、比較するために日時を(プレーンな日付に)変換しています。つまり、データベース エンジンは、テーブル内のすべての*単一*レコードを調べて、求めている基準を満たしているかどうかを確認する必要があります。にインデックスがあってもins_date、エンジンはそれを使用して目的のレコードを見つけることができません。

native列をそのままの形で (つまり、列に変換を適用せずに)使用するようにクエリを作り直すことができるかどうかを確認してください。結合またはフィルターを実行するために列に何らかの変換を適用する必要がある場合は、取得して変換する必要があるレコードの数を減らすために、その結​​合内の最も小さなテーブルに対してのみ適用するようにしてください。

可能であれば、これがたまにしか実行されないクエリである場合は、使用している列を DATETIME 型ではなく DATE 型に再定義できるかどうかを確認してください。アプリケーションで DATETIME 値の時間部分が必要な場合は、その DateTime 値の DATE 部分のみでゴースト DATE 列を維持できるかどうかを確認してください (これは、挿入クエリまたはトリガーによって維持できます)。 )。

于 2013-07-28T05:36:54.890 に答える