Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Indeks Hash MySQL untuk Pengoptimalan

Pertama, untuk menjawab pertanyaan spesifik yang Anda ajukan:

  1. Seperti yang didokumentasikan dalam CREATE INDEX Sintaks :

    Oleh karena itu, bahkan sebelum mempertimbangkan HASH pengindeksan, orang harus menyadari bahwa itu hanya tersedia di MEMORY dan NDB mesin penyimpanan:jadi mungkin bukan pilihan bagi Anda.

    Selain itu, perlu diketahui bahwa indeks pada kombinasi ID dan Lookup saja mungkin tidak optimal, karena Anda WHERE predikat juga memfilter pada tablea.Elg_IDpart1 dan tableb.IDpart1 —Anda juga dapat memperoleh manfaat dari pengindeksan pada kolom tersebut.

  2. Asalkan jenis indeks yang diinginkan didukung oleh mesin penyimpanan, Anda dapat mencampurnya sesuai keinginan.

  3. Anda dapat menggunakan petunjuk indeks untuk memaksa MySQL menggunakan indeks yang berbeda dengan indeks yang akan dipilih oleh pengoptimal.

  4. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL mengurutkan pada perhitungan

  2. Bagaimana cara mengetahui kata sandi root MySQL saya?

  3. Koneksi JDBC- Class.forName vs Class.forName().newInstance?

  4. Bagaimana cara mengubah DateTime menjadi angka di MySQL?

  5. Beberapa Tabel Pilih vs. GABUNG (kinerja)