ホームページ  >  に質問  >  本文

このクエリ更新が正常に実行できないのはなぜですか?

<p>customers (3000 行) とphone_call_log (350,000 行) の 2 つのテーブルがあります。 </p> <p>通話ログを使用して各顧客への最後の通話時刻を実装する必要があります (フロントエンド検索の方が高速です)。 </p> <p>インデックスは次のとおりです。</p>
P粉885562567P粉885562567413日前507

全員に返信(2)返信します

  • P粉009186469

    P粉0091864692023-09-04 14:58:45

    最速

    電話がかかってきたら、データ フローを変更して customers.last_call を更新します。

    接続の更新

    UPDATEJOIN と比較すると、IN (SELECT ...) の方が効果的です。

    ######または######

    OR はパフォーマンスを低下させます。このクエリでは、各顧客の

    phone_call_log

    全体をスキャンする可能性が高くなります。 回避策の 1 つは、UPDATE を 2 回実行し、適切なインデックスを使用することです:

    リーリー

    これには、phone_call_log に次のインデックスを作成する必要があります:

    リーリー

    And現在の単一列インデックスの呼び出し元と呼び出し先を削除します。

    データの種類

    電話番号の場合、特に LENGTH(customers.phonenumber) > 6 を考慮すると、

    BIGINT

    の使用は間違っている可能性があります。 実際には、これらすべては簡単なテストに要約されます: リーリー すべての

    >

    チェックでは

    NOT NULL

    がチェックされ、データ型に応じてそのうちの 1 つだけが使用され、インデックスが付けられます。 (SHOW CREATE TABLE を入力してください。「英語」では正確さが不十分です。)

    返事
    0
  • P粉354602955

    P粉3546029552023-09-04 10:38:38

    OR を使用したクエリでは、インデックスを効果的に使用できません。次のことを試してみることをお勧めします:

    リーリー

    #GREATEST には NULL 値の処理に問題があることに注意してください。

    返事
    0
  • キャンセル返事