Apa yang akan menjawab pertanyaan Anda adalah subjek JOIN DECOMPOSITION.
Menurut Halaman 209 dari Buku itu
Anda bisa menguraikan gabung dengan menjalankan beberapa kueri tabel tunggal alih-alih gabung multitable, dan kemudian melakukan gabung dalam aplikasi. Misalnya, alih-alih permintaan tunggal ini:
SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id = tag.id
JOIN post ON tag_post.post_id = post.id
WHERE tag.tag = 'mysql';
Anda dapat menjalankan kueri ini:
SELECT * FROM tag WHERE tag = 'mysql';
SELECT * FROM tag_post WHERE tag_id=1234;
SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);
Kenapa kamu melakukan ini? Sekilas terlihat boros, karena Anda telah meningkatkan jumlah kueri tanpa mendapatkan balasan apa pun. Namun, restrukturisasi semacam itu sebenarnya dapat memberikan keuntungan kinerja yang signifikan:
- Caching bisa lebih efisien. Banyak aplikasi cache "objek" yang memetakan langsung ke tabel. Dalam contoh ini, jika objek dengan tag
mysql
sudah di-cache, aplikasi akan melewati kueri pertama. Jika Anda menemukan posting dengan ID 123, 567, atau 908 di cache, Anda dapat menghapusnya dari IN()
daftar. Tembolok kueri mungkin juga mendapat manfaat dari strategi ini. Jika hanya satu tabel yang sering berubah, penguraian gabungan dapat mengurangi jumlah cacat cache.
- Menjalankan query secara individual terkadang dapat mengurangi pertikaian kunci
- Melakukan bergabung dalam aplikasi memudahkan untuk skala database dengan menempatkan tabel pada server yang berbeda.
- Pertanyaan itu sendiri bisa lebih efisien. Dalam contoh ini, menggunakan
IN()
daftar alih-alih bergabung memungkinkan MySQL mengurutkan ID baris dan mengambil baris lebih optimal daripada yang mungkin dilakukan dengan bergabung.
- Anda dapat mengurangi akses baris yang berlebihan. Melakukan join dalam aplikasi berarti mengambil setiap baris hanya sekali., Sedangkan join dalam query pada dasarnya adalah denormalisasi yang mungkin berulang kali mengakses data yang sama. Untuk alasan yang sama, restrukturisasi tersebut juga dapat mengurangi total lalu lintas jaringan dan penggunaan memori.
- Sampai batas tertentu, Anda dapat melihat teknik ini sebagai pengimplementasian hash join secara manual, alih-alih algoritma nested loop yang digunakan MySQL untuk menjalankan join. Gabung hash mungkin lebih efisien.
Akibatnya, melakukan penggabungan dalam aplikasi bisa lebih efisien ketika Anda melakukan cache dan menggunakan kembali banyak data dari kueri sebelumnya, Anda mendistribusikan data di beberapa server, Anda mengganti IN()
gabung dengan daftar, atau gabungan merujuk ke tabel yang sama beberapa kali.
PENGAMATAN
Saya suka bulletpoint pertama karena InnoDB agak berat ketika crosscheck cache kueri.
Sedangkan untuk bulletpoint terakhir, saya menulis posting kembali pada 11 Maret 2013 ( Apakah ada perbedaan eksekusi antara kondisi JOIN dan kondisi WHERE? ) Yang menjelaskan algoritma nested loop. Setelah membacanya, Anda akan melihat seberapa bagus dekomposisi gabungan.
Adapun semua poin lain dari buku ini , para pengembang benar-benar mencari kinerja sebagai garis bawah. Beberapa mengandalkan cara eksternal (di luar aplikasi) untuk peningkatan kinerja seperti menggunakan disk cepat, mendapatkan lebih banyak CPU / Core, menyetel mesin penyimpanan, dan menyetel file konfigurasi. Orang lain akan bekerja keras dan menulis kode yang lebih baik. Beberapa mungkin menggunakan pengkodean semua intelijen bisnis dalam Prosedur yang Disimpan tetapi masih belum menerapkan dekomposisi gabungan (Lihat Apa argumen yang menentang atau untuk menempatkan logika aplikasi di lapisan basis data? Bersama dengan postingan lain). Semuanya tergantung pada budaya dan toleransi masing-masing toko pengembang.
Beberapa mungkin puas dengan kinerja dan tidak menyentuh kode lagi. Lainnya tidak menyadari ada manfaat besar yang bisa dipetik orang jika mereka mencoba bergabung komposisi.
Bagi para pengembang yang bersedia ...
COBALAH !!!