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

Cara Mengoptimalkan Kueri dalam Basis Data - Dasar-Dasar

Anda harus melakukan pencarian untuk setiap kondisi where dan untuk setiap join...on condition. Keduanya bekerja sama.

Misalkan kita menulis

select name
from customer
where customerid=37;

Entah bagaimana DBMS harus menemukan record atau record dengan customerid=37. Jika tidak ada indeks, satu-satunya cara untuk melakukannya adalah dengan membaca setiap record dalam tabel yang membandingkan customerid dengan 37. Bahkan ketika ditemukan, ia tidak memiliki cara untuk mengetahui bahwa hanya ada satu, jadi ia harus terus mencari lainnya.

Jika Anda membuat indeks di customerid, DBMS memiliki cara untuk mencari indeks dengan sangat cepat. Ini bukan pencarian berurutan, tetapi, tergantung pada database, pencarian biner atau beberapa metode efisien lainnya. Persisnya bagaimana tidak masalah, terimalah bahwa itu jauh lebih cepat daripada berurutan. Indeks kemudian membawanya langsung ke catatan atau catatan yang sesuai. Selanjutnya, jika Anda menentukan bahwa indeks itu "unik", maka database tahu bahwa hanya ada satu sehingga tidak membuang waktu untuk mencari yang kedua. (Dan DBMS akan mencegah Anda menambahkan satu detik.)

Sekarang pertimbangkan pertanyaan ini:

select name
from customer
where city='Albany' and state='NY';

Sekarang kita memiliki dua syarat. Jika Anda memiliki indeks hanya pada salah satu bidang tersebut, DBMS akan menggunakan indeks tersebut untuk menemukan subset catatan, lalu mencarinya secara berurutan. Misalnya, jika Anda memiliki indeks di negara bagian, DBMS akan dengan cepat menemukan catatan pertama untuk NY, kemudian secara berurutan mencari mencari city='Albany', dan berhenti mencari ketika mencapai catatan terakhir untuk NY.

Jika Anda memiliki indeks yang mencakup kedua bidang, yaitu "buat indeks pada pelanggan (negara bagian, kota)", maka DBMS dapat segera memperbesar ke catatan yang benar.

Jika Anda memiliki dua indeks terpisah, satu di setiap bidang, DBMS akan memiliki berbagai aturan yang berlaku untuk memutuskan indeks mana yang akan digunakan. Sekali lagi, persisnya bagaimana hal ini dilakukan tergantung pada DBMS tertentu yang Anda gunakan, tetapi pada dasarnya ia mencoba untuk menyimpan statistik pada jumlah total catatan, jumlah nilai yang berbeda, dan distribusi nilai. Kemudian akan mencari record-record tersebut secara berurutan untuk record-record yang memenuhi kondisi lainnya. Dalam hal ini DBMS mungkin akan mengamati bahwa ada lebih banyak kota daripada negara bagian, jadi dengan menggunakan indeks kota dapat dengan cepat memperbesar catatan 'Albany'. Kemudian secara berurutan akan mencari ini, memeriksa status masing-masing terhadap 'NY'. Jika Anda memiliki catatan untuk Albany, California, ini akan dilewati.

Setiap bergabung membutuhkan semacam pencarian.

Katakanlah kita menulis

select customer.name
from transaction
join customer on transaction.customerid=customer.customerid
where transaction.transactiondate='2010-07-04' and customer.type='Q';

Sekarang DBMS harus memutuskan tabel mana yang akan dibaca terlebih dahulu, memilih record yang sesuai dari sana, dan kemudian menemukan record yang cocok di tabel lain.

Jika Anda memiliki indeks pada transaction.transactiondate dan customer.customerid, rencana terbaik kemungkinan adalah menemukan semua transaksi dengan tanggal ini, dan kemudian untuk masing-masing menemukan pelanggan dengan customerid yang cocok, dan kemudian memverifikasi bahwa pelanggan memiliki jenis yang tepat.

Jika Anda tidak memiliki indeks pada customer.customerid, maka DBMS dapat dengan cepat menemukan transaksi tersebut, tetapi kemudian untuk setiap transaksi ia harus secara berurutan mencari tabel pelanggan untuk mencari customerid yang cocok. (Ini mungkin akan sangat lambat.)

Misalkan sebagai gantinya satu-satunya indeks yang Anda miliki adalah pada transaction.customerid dan customer.type. Kemudian DBMS kemungkinan akan menggunakan rencana yang sama sekali berbeda. Ini mungkin akan memindai tabel pelanggan untuk semua pelanggan dengan jenis yang benar, kemudian untuk masing-masing menemukan semua transaksi untuk pelanggan ini, dan secara berurutan mencari tanggal yang tepat.

Kunci terpenting untuk pengoptimalan adalah mencari tahu indeks apa yang benar-benar akan membantu dan membuat indeks tersebut. Ekstra, indeks yang tidak digunakan membebani database karena perlu usaha untuk memeliharanya, dan jika tidak pernah digunakan, ini adalah upaya yang sia-sia.

Anda dapat mengetahui indeks apa yang akan digunakan DBMS untuk setiap kueri yang diberikan dengan perintah EXPLAIN. Saya menggunakan ini sepanjang waktu untuk menentukan apakah kueri saya dioptimalkan dengan baik atau apakah saya harus membuat indeks tambahan. (Baca dokumentasi pada perintah ini untuk penjelasan tentang outputnya.)

Peringatan:Ingat bahwa saya mengatakan bahwa DBMS menyimpan statistik pada jumlah catatan dan jumlah nilai yang berbeda dan seterusnya di setiap tabel. EXPLAIN mungkin memberi Anda rencana yang sama sekali berbeda hari ini daripada yang diberikan kemarin jika datanya telah berubah. Misalnya, jika Anda memiliki kueri yang menggabungkan dua tabel dan salah satu tabel ini sangat kecil sementara yang lain berukuran besar, kueri tersebut akan cenderung membaca tabel kecil terlebih dahulu, lalu menemukan rekaman yang cocok di tabel besar. Menambahkan catatan ke tabel dapat mengubah mana yang lebih besar, dan dengan demikian menyebabkan DBMS mengubah rencananya. Dengan demikian, Anda harus mencoba melakukan EXPLAINS terhadap database dengan data yang realistis. Menjalankan database pengujian dengan 5 record di setiap tabel memiliki nilai yang jauh lebih rendah daripada menjalankan database langsung.

Sebenarnya masih banyak lagi yang bisa diceritakan, tapi saya tidak ingin menulis buku di sini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perlu mendapatkan catatan dari database MySQL berdasarkan tanggal hanya dari bidang datetime

  2. Pilih nilai yang memenuhi kondisi berbeda pada baris berbeda?

  3. Cara mendekati dilema:pesanan ekspor dari sistem magento lama impor ke magento baru, ID yang tumpang tindih

  4. SQLSTATE[HY093]:Nomor parameter tidak valid:jumlah variabel terikat tidak cocok dengan jumlah token pada baris 102

  5. Apa bidang terbaik untuk menyimpan ulang tahun?