私は時間がかかりすぎていました(32分)ので、他の方法を試してみました。MySQLの最適化。なぜoption2がoption1よりも速いのですか
私はようやく5秒以内に別のものを書きました 問題は私の最適化を理解できないことです。
誰かがそれがはるかに速くなる方法を説明することができます。
hugeTableがsmallTable1は983行
smallTable2は983行
cursor.execute('UPDATE hugeTable dst,
(
SELECT smallTable1.hugeTableId, smallTable2.valueForHugeTable
FROM smallTable2
INNER JOIN smallTable1 ON smallTable1.id = smallTable2.id
-- This select represent 983 rows
)src
SET dst.columnToUpdate = src.valueForHugeTable
WHERE dst.id2 = %s AND dst.id = src.hugeTableId;', inputId2)
-- Condition : dst.id2 = %s alone target 983 rows.
-- Combinasion of : dst.id2 = %s AND dst.id = src.hugeTableId target a single unique row.
-- This query takes 32 minutes
があり、ここでより多くのステップとまったく同じ要求を行うための方法ですが、道より高速を持っている494 500行
を持っています:
-- First create a temporary table to hold (983) rows from hugeTable that has to be updated
cursor.execute('CREATE TEMPORARY TABLE tmpTable AS
SELECT * from hugeTable
WHERE id2 = %s;', inputid)
-- Update the rows into tmpTable instead of into hugeTable
cursor.execute('UPDATE tmpTable dst,
(
SELECT smallTable1.hugeTableId, smallTable2.valueForHugeTable
FROM smallTable2
INNER JOIN smallTable1 ON smallTable1.id = smallTable2.id
-- This select represent 983 rows
)src
SET dst.columnToUpdate = src.valueForHugeTable
WHERE dst.id = src.hugeTableId;')
-- Then delete the (983) rows we want to update
cursor.execute('DELETE FROM hugeTable WHERE id2 = %s;', inputId2)
-- And create new rows replacing the above deleled ones with rows from tmpTable
cursor.execute('INSERT INTO hugeTable SELECT * FROM tmpTable;')
-- This takes litle under 5 seconds.
私は最初の方法が多くの時間。 これを理解することで、新しいMySqlレベルを上げるのに役立ちます。
50万行のうち1000行を更新するのに5秒はかかりません。しかし、根本的な問題は、簡単な結合ではなくサブクエリの使用と一緒に索引付けの欠如であると思われます。 EXPLAIN(および関連するすべてのテーブルの適切なCREATEステートメント)を使用すると、より多くのことがわかります。 – Strawberry
両方のテーブルはキーもインデックスもなく単純です。この質問では、私は5秒より早くしようとはしていません。最初の方法が32分かかる理由を理解したい。 –