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

Bagaimana saya membuat kueri ini berjalan lebih cepat?

Indeks

  • Anda membutuhkan - setidaknya - indeks pada setiap bidang yang digunakan dalam JOIN kondisi.

  • Indeks pada bidang yang muncul di WHERE atau GROUP BY atau ORDER 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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hitung Usia di MySQL (InnoDb)

  2. Bagaimana cara mengikat datatable ke runtime reportviewer

  3. proposal struktur tabel mysql?

  4. Masukkan teks persia di tabel mysql

  5. Cara menggunakan kotak centang untuk mengambil data tertentu dalam database