2
SELECT t1 . * FROM table1 t1, table1 t2
   WHERE t1.history_id < t2.history_id
     AND (t1.license_id = t2.license_id
        OR (t1.license_id IS NULL AND t2.license_id IS NULL))
     AND t1.op_id = t2.op_id
     AND (t1.service_date = t2.service_date
         OR (t1.service_date IS NULL AND t2.service_date IS NULL))
     AND t1.customer_id = t2.customer_id
     AND t1.serial_id = t2.serial_id.

クエリの目的は、上記のクエリ条件に基づいて重複行を削除することです。クエリは、テーブル 'table1' をそれ自体に結合します。のグループ インデックスを使用してインデックスを作成しました

  1. license_id
  2. service_date
  3. 顧客ID
  4. history_id (主キー)
  5. op_id。

正しく実行されOR (t1.service_date IS NULL AND t2.service_date IS NULL)ますが、クエリの実行が非常に遅くなります。テーブルには 2 つ以上のデータの欠落があります。

MySQLEXPLAINコマンドを使用しました。これが出力です

ここに画像の説明を入力

クエリの実行時間を改善するにはどうすればよいですか?

4

1 に答える 1

0

問題は「ISNULL」です。追加情報については、こちらをお読みください:ISNULLを使用する場合

1つの解決策は、テーブルからNULL値を削除し(たとえば、有効なMYSQL自動インクリメント値ではないため「0」に変更する)、「ISNULL」を「=0」に変更することです。

于 2012-11-09T15:27:17.717 に答える