Pertama, untuk menjawab pertanyaan spesifik yang Anda ajukan:
-
Seperti yang didokumentasikan dalam
CREATE INDEX
Sintaks :Oleh karena itu, bahkan sebelum mempertimbangkan
HASH
pengindeksan, orang harus menyadari bahwa itu hanya tersedia diMEMORY
danNDB
mesin penyimpanan:jadi mungkin bukan pilihan bagi Anda.Selain itu, perlu diketahui bahwa indeks pada kombinasi
ID
danLookup
saja mungkin tidak optimal, karena AndaWHERE
predikat juga memfilter padatablea.Elg_IDpart1
dantableb.IDpart1
—Anda juga dapat memperoleh manfaat dari pengindeksan pada kolom tersebut. -
Asalkan jenis indeks yang diinginkan didukung oleh mesin penyimpanan, Anda dapat mencampurnya sesuai keinginan.
-
Anda dapat menggunakan petunjuk indeks untuk memaksa MySQL menggunakan indeks yang berbeda dengan indeks yang akan dipilih oleh pengoptimal.
-
Itu biasanya cukup pintar, tapi tidak selalu. Namun, dalam kasus ini, mungkin telah ditentukan bahwa kardinalitas indeks sedemikian rupa sehingga lebih baik menggunakan indeks yang telah dipilihnya.
Sekarang, tergantung pada versi MySQL yang Anda gunakan, tabel yang diturunkan dari subquery mungkin tidak memiliki indeks apa pun di atasnya yang dapat digunakan untuk pemrosesan lebih lanjut:akibatnya gabungkan dengan b
mungkin memerlukan pemindaian penuh dari tabel turunan itu (tidak ada informasi yang cukup dalam pertanyaan Anda untuk menentukan dengan tepat seberapa besar masalah ini, tetapi schema1.tableb
memiliki 1,5 juta catatan menunjukkan itu bisa menjadi faktor yang signifikan).
Lihat Pengoptimalan Subquery untuk informasi lebih lanjut.
Oleh karena itu, seseorang harus mencoba menghindari penggunaan tabel turunan jika memungkinkan. Dalam hal ini, tampaknya tidak ada tujuan apa pun pada tabel turunan Anda karena seseorang dapat dengan mudah bergabung dengan schema1.tablea
dan schema1.tableb
langsung:
UPDATE schema1.tablea a
JOIN schema1.tableb b USING (ID, Lookup)
SET a.Elg_IDpart1 = b.IDpart1,
a.Elg_IDpart2 = b.IDpart2
WHERE a.Elg_IDpart1 IS NULL
AND a.ID IS NOT NULL
AND b.IDpart1 IS NOT NULL
AND b.Lookup IS NOT NULL
ORDER BY ID, Lookup
Satu-satunya hal yang hilang adalah filter untuk DISTINCT
catatan, tetapi catatan duplikat hanya akan (mencoba) menimpa nilai yang diperbarui dengan nilai yang sama lagi—yang tidak akan berpengaruh, tetapi mungkin terbukti sangat mahal (terutama dengan begitu banyak catatan dalam tabel itu).
Penggunaan ORDER BY
dalam tabel turunan tidak ada gunanya karena tidak dapat diandalkan untuk mencapai urutan tertentu ke UPDATE
, sedangkan dalam versi revisi ini akan memastikan bahwa setiap pembaruan yang menimpa yang sebelumnya terjadi dalam urutan yang ditentukan:tetapi apakah itu perlu? Mungkin dapat dihapus dan disimpan pada operasi penyortiran apa pun.
Seseorang harus memeriksa predikat di WHERE
klausa:apakah semuanya perlu (NOT NULL
cek di a.ID
dan b.Lookup
, misalnya, tidak berguna mengingat NULL
. tersebut catatan akan dihilangkan dengan JOIN
predikat)?
Secara keseluruhan, ini memberi kita:
UPDATE schema1.tablea a
JOIN schema1.tableb b USING (ID, Lookup)
SET a.Elg_IDpart1 = b.IDpart1,
a.Elg_IDpart2 = b.IDpart2
WHERE a.Elg_IDpart1 IS NULL
AND b.IDpart1 IS NOT NULL
Hanya jika kinerja masih tidak memuaskan, orang harus melihat lebih jauh pada pengindeksan. Apakah kolom yang relevan (yaitu yang digunakan dalam JOIN
.) dan WHERE
predikat) diindeks? Apakah indeks yang dipilih untuk digunakan oleh MySQL (ingat bahwa hanya dapat menggunakan satu indeks per tabel untuk pencarian:untuk menguji keduanya JOIN
predikat dan predikat filter:mungkin Anda memerlukan indeks komposit yang sesuai)? Periksa rencana eksekusi kueri dengan menggunakan EXPLAIN
untuk menyelidiki masalah tersebut lebih lanjut.