2 つのデータベース テーブル間で更新クエリを実行していますが、非常に遅いです。例:クエリを実行するには30日かかります。
1 つのテーブル lab.list には約 940,000 レコードが含まれ、もう 1 つのテーブルには約 3,700,000 (370 万) の mind.list が含まれます。2 つの BETWEEN 条件が満たされた場合、更新によってフィールドが設定されます。これはクエリです:
UPDATE lab.list L , mind.list M SET L.locId = M.locId WHERE L.longip BETWEEN M.startIpNum AND M.endIpNum AND L.date BETWEEN "20100301" AND "20100401" AND L.locId = 0
現在、クエリは 8 秒ごとに約 1 回の更新で実行されています。
同じデータベースの mind.list テーブルでも試してみましたが、クエリ時間は問題ありません。
UPDATE lab.list L, lab.mind M SET L.locId = M.locId WHERE longip BETWEEN M.startIpNum AND M.endIpNum AND date BETWEEN "20100301" AND "20100401" AND L.locId = 0;
このクエリを高速化する方法はありますか? 基本的に私見では、データベースの 2 つのサブセットを作成する必要があります: mind.list.longip BETWEEN M.startIpNum AND M.endIpNum lab.list.date BETWEEN "20100301" AND "20100401"
次に、これらのサブセットの値を更新します。どこかで間違いを犯したと思いますが、どこで?たぶん、より高速なクエリが可能ですか?
log_slow_queries を試してみましたが、実際には何億行も調べていることがわかり、おそらく 3331 ギガ行にまで増加しています。
技術情報:
- サーバーのバージョン: 5.5.22-0ubuntu1-log (Ubuntu)
- lab.list には locId、longip、date のインデックスがあります
- lab.mind には、locId、startIpNum、M.endIpNum のインデックスがあります。
- ハードウェア: 2x xeon 3.4 GHz、4GB RAM、128 GB SSD (問題ないはずです!)