-1

重複の可能性:日時列から日付を選択するには?

しかし、受け入れられた回答の問題は、完全なテーブルスキャンを実行することです。

私はこのようなことをしたい:

UPDATE records SET earnings=(SELECT SUM(rate) 
FROM leads 
WHERE records.user_id=leads.user_id 
   AND DATE(leads.datetime)=records.date)

最後の部分に注意してください: DATE(leads.datetime)=records.date. これはまさに必要なことを行いますが、すべての行をスキャンする必要があります。一部のユーザーは何千ものリードを持っているため、時間がかかる場合があります。

leadsテーブルには ,がINDEXありuser_idますdatetime

インターバル関数を使用して、そのようなことを行うことができることを知っていますWHERE datetime BETWEEN date AND interval + days

これを行う最も効率的で正確な方法は何ですか?

4

2 に答える 2

3

MySQL の日付関数に詳しくありませんが、次のように変更してみてください。

UPDATE records SET earnings=
  (SELECT SUM(rate) 
   FROM leads 
   WHERE records.user_id=leads.user_id 
     AND  leads.datetime >= records.date
     And  leads.datetime < records.date [+ one day])  -- however you do that in MySQL

式がSargableDATE(leads.datetime)ではないため、完全なテーブル スキャンを取得しています。これは、テーブルの列に格納された値を操作する必要があり、その列の任意のインデックスにも格納される関数であるためです。関数の値は、明らかに、事前に計算して任意のインデックスに格納することはできず、実際の列の値のみです。そのため、インデックス検索では、関数を実行した後に、Where 句の述語で表された基準を満たす行を特定できません。 . 式を変更して、列の値がそれ自体で where 句演算子の一方または他方 (等号など) にあるようにすると、インデックス内の列の値を単一の式に基づいて検索できます。

于 2013-07-29T03:24:28.777 に答える
2

これを試すことができます:

UPDATE records
    SET earnings = (SELECT SUM(rate)
                    FROM leads
                    WHERE records.user_id=leads.user_id AND
                          leads.datetime >= records.date and
                          leads.datetime < date_add(records.date, interval 1 day)
                   );

これが機能するには、インデックスが必要ですleads(user_id, datetime)

于 2013-07-29T03:24:51.150 に答える