Indeks
-
Anda membutuhkan - setidaknya - indeks pada setiap bidang yang digunakan dalam
JOIN
kondisi. -
Indeks pada bidang yang muncul di
WHERE
atauGROUP BY
atauORDER BY
klausa sebagian besar waktu berguna juga. -
Saat dalam tabel, dua atau lebih bidang digunakan dalam GABUNGAN (atau WHERE atau GROUP BY atau ORDER BY), indeks gabungan (gabungan) dari bidang ini (dua atau lebih) mungkin lebih baik daripada indeks terpisah. Misalnya di
SiteNumbers
tabel, indeks yang mungkin adalah gabungan(number_accountid, number_active)
atau(number_active, number_accountid)
. -
Kondisi di bidang yang Boolean (ON/OFF, aktif/tidak aktif) terkadang memperlambat kueri (karena indeks tidak selektif dan karenanya tidak terlalu membantu). Restrukturisasi (ayah normalisasi) tabel adalah opsi dalam kasus itu, tetapi mungkin Anda dapat menghindari kerumitan tambahan.
Selain saran biasa (periksa rencana EXPLAIN, tambahkan indeks jika diperlukan, uji variasi kueri),
Saya perhatikan bahwa dalam permintaan Anda ada Produk Cartesian parsial. Tabel Accounts
memiliki hubungan satu-ke-banyak ke tiga tabel FTPDetails
, SiteNumbers
dan PPC
. Ini memiliki efek bahwa jika Anda memiliki misalnya 1000 akun, dan setiap akun terkait dengan, katakanlah, 10 FTPDetails, 20 SiteNumber, dan 3 PPC, kueri akan kembali untuk setiap akun 600 baris (produk dari 10x20x3). Total 600 ribu baris di mana banyak data diduplikasi.
Anda malah bisa membagi kueri menjadi tiga plus satu untuk data dasar (Akun dan tabel lainnya). Dengan begitu, hanya 34 ribu baris data (yang panjangnya lebih kecil) yang akan ditransfer :
Accounts JOIN Clients JOIN Users
(with all fields needed from these tables)
1K rows
Accounts JOIN FTPDetails
(with Accounts.account_id and all fields from FTPDetails)
10K rows
Accounts JOIN SiteNumbers
(with Accounts.account_id and all fields from SiteNumbers)
20K rows
Accounts JOIN PPC
(with Accounts.account_id and all fields from PPC)
3K rows
lalu gunakan data dari 4 kueri di sisi klien untuk menampilkan info gabungan.
Saya akan menambahkan indeks berikut:
Table Accounts
index on (account_designer)
index on (account_client)
index on (account_active, account_id)
index on (account_update)
Table FTPDetails
index on (ftp_active, ftp_accountid)
Table SiteNumbers
index on (number_active, number_accountid)
Table PPC
index on (ppc_active, ppc_accountid)