Sebelum kita membahas cara optimize Query SQL, saya ingin mengutarakan kebingungan saya mengenai penggunaan bahasa Indonesia untuk kata "query" . Padanan yang paling mendekati yang ada di kamus Inggris-Indonesia menyebutkan kata "pertanyaan" yang menurut saya tidak menggambarkan arti query yang saya gunakan. Maka dari itu untuk memudahkan pemahaman, dalam tulisan ini saya masih menggunakan istilah query agar tidak terjadi salah penafsiran dari pembaca. Baiklah langsung saja kita ke inti tulisan, 15 cara mengoptimalkan query SQL yang dapat anda terapkan dalam dunia koding anda.
Index
Mengindeks kolom dalam tabel adalah cara yang biasa dilakukan untuk mengoptimalkan hasil pencarian query SQL. Membuat indeks dalam sql tak ubahnya seperti membuat daftar indeks pada buku. Bayangkan ketika anda ingin mencari sebuah section pada buku mengenai suatu hal dan harus mencari setiap halaman dari awal sampai akhir, dengan indeks anda cukup mencari urutan indeks kata tersebut dan langsung membuka halaman rujukan yang ada pada indeks. Penggunaan indeks pada eksekusi query SQL akan benar-benar terasa ketika tabel dan basis data yang kita punya sudah cukup besar.
Symbol Operator
Penggunaan operator simbol seperti <, >, =, !=, ><, dll sangat membantu dalam menghasilkan kecepatan pencarian dari query. Cara kerja database management system (DBMS) dalam menerapkan query dengan kondisi ">" dibandingkan dengan "=>" akan sedikit berbeda, apabila kita menggunakan "=>" maka DBMS akan menerapkan dua kriteria pada setiap hasil, tidak langsung mencari pada kondisi langsung seperti apabila kita menggunakan ">".
Wildcard (kartu liar)
Wildcard yang digambarkan dengan simbol "%" yang kita tuliskan pada kondisi/kriteria query akan sangat berpengaruh pada lamanya proses pencarian. Wildcard sendiri dapat kita bagi menjadi tiga bagian penggunaan, yaitu wildcard penuh (contoh '%kata%'), postfix wildcard (contoh 'kata%'), dan prefix wildcard (contoh '%kata'). Sebisa mungkin hindari penggunaan wildcard penuh karena untuk ukuran tabel dengan baris yang banyak, dan pencarian kolum dengan panjang kolom yang besar akan benar-benar menyiksa basis data dalam melakukan pencarian.
Operator Negatif
Penggunaan operator negatif (seperti NOT, NOT LIKE, NOT IN, NOT EXIST, != dll) akan lebih memakan waktu lama dibandingkan operator positif. Operator = merupakan operator paling memudahkan database dalam melakukan pencarian, terutama ketika database sudah terindeks maka pencarian exact match ini akan dihasilkan dengan cepat.
COUNT vs EXIST
Seringkali dalam pembuatan sebuah loop dan logika dalam aplikasi- kita ingin membuat penguji sederhana dengan pembuatan perintah yang dilaksanakan hanya jika sebuah nilai ada dalam tabel (pada kolom tertentu dalam tabel) - kita menggunakan COUNT sebagai kriteria. Dalam artian ketika COUNT menghasilkan angka > 0 maka loop atau logika akan dijalankan.
SELECT KOLOM FROM TABEL WHERE COUNT > 0
Penggunaan COUNT akan melakukan pencarian dari awal hingga akhir baris dari tabel. Sebagai alternatif yang lebih baik anda dapat menggunakan EXIST, kriteria ini akan menghentikan pencarian ketika kriteria/kondisi sudah ditemukan.
Wildcard vs Substr
Penggunaan substr() dalam query akan membuat DBMS berusaha memotong seluruh kolom dalam sebuah tabel sesuai kondisi substr(). Sebagai alternatif yang lebih baik dapat digunakan postfix wildcard untuk membuat pencarian menjadi lebih cepat.
Index Unique Column
Hal ini masih berhubungan dengan indexing pada bahasan pertama. Index bertipe unik (unique) dalam beberapa DBMS akan memberikan kecepatan pencarian tersendiri, terutama index yang paling sering dilakukan pencarian.
Operator Max dan Min
Max dan Min adalah operator yang sebisa mungkin tidak terlalu sering digunakan karena pencarian yang digunakan dilakukan secara menyeluruh dari awal sampai akhir tabel. Penggunaan index akan sangat membantu jika nilai maksimum/minimum yang dijadikan sebagai kriteria adalah indeks. Tapi pada umumnya tipe kolom yang dijadikan kriteria adalah int, dec, dan date/time.
Tipe Data
Gunakan tipe data yang paling kecil yang dapat digunakan dengan turut memperhatikan kebutuhan dimasa yang akan datang. Penggunaan tinyint dan int akan memberikan hasil yang berbeda, begitu juga dengan hasil pencarian.
Primary Index
Primary Column yang digunakan untuk indeks harus dibuat sependek mungkin, dengan begitu identifikasi dari baris-baris yang ada akan lebih efisien bagi DBMS.
String Indexing
Pengindeks-an seluruh string sebenarnya tidak perlu dilakukan karena akan lebih baik jika kita menggunakan prefix atau postfix dari string akan menghasilkan daftar isi yang lebih ringkas dan efisien. Ingat, semakin pendek indeks maka pencarian akan menjadi lebih cepat dan lebih hemat sumber daya.
Batasi Hasil Query
Hasil query yang menampilkan seluruh tabel memang tidak terlalu masalah jika memang kita membutuhkan hasil penuh. Namun ketika berbicara aplikasi yang akan dilihat oleh pengguna (bukan pengolahan data lebih lanjut) maka membatasi hasil query akan lebih baik. Pagination dengan menggunakan LIMIT sebesar 10, 30, atau 50 dirasa sudah cukup untuk menampilkan aplikasi yang akan dibaca oleh pengguna.
Gunakan Nilai Otomatis (Default Value)
Penggunaan nilai otomatis pada beberapa DBMS yang menyediakan fitur ini sangat bermanfaat terutama dalam hal melakukan insert pada basis data. Nilai otomatis akan mempercepat kerja DBMS dalam Insert data ketika tidak ada nilai yang dikirim dari query yang dieksekusi.
IN SUBQUERY
Penggunaan IN umum digunakan ketika kriteria yang kita gunakan berupa array. Penggunaan subquery sering digunakan dalam membentuk kriteria dinamis yang akan digunakan dalam kriteria IN. Namun hal ini akan lebih berat karena DBMS akan menggunakan kriteria induk terlebih dahulu, baru kemudian menggunakan kriteria subquery. Dalam hal ini DBMS bekerja 3 tahap, dimana dengan kriteria IN yang konstan hanya akan menjalankan 1 tahap pencarian saja.
Sebagai alternatif anda dapat membuat array dengan mendeclare terlebih dahulu subquery ke dalam sebuah variabel, dengan begitu variabel ini dapat digunakan berkali-kali dalam query yang lain. Akan lebih baik jika kita melibatkan sumber daya yang dimiliki pengguna dengan membuat session.
Menggunakan UNION dibandingkan OR
Penggunaan OR sebagai kriteria berganda adalah jamak dilakukan. Namun ada alternatif lain yang dapat dibuat yaitu dengan menggunakan UNION apabila kolom yang ingin kita cari adalah sama. Namun tentunya penggunaan UNION ini memiliki keterbatasan. Perbedaan kecepatan untuk kriteria OR, UNION, dan IN sebenarnya dapat diperdebatkan mengingat ketiga kondisi kriteria di atas memerlukan strategi algoritma koding yang berbeda dari tiap programmer.
Oke itulah 15 cara yang dapat kita lakukan dalam mengoptimalkan hasil dari query kita. Dan tentunya yang paling menentukan sebelum semua hal tersebut di atas adalah penggunaan struktur tabel dalam basis data kita haruslah sudah optimal.
Baik sebelum saya akhiri, sebagian mungkin memperhatikan gaya penulisan saya dalam tulisan ini lebih resmi dari biasanya. Dalam rangka melatih penulisan tulisan ilmiah maka saya mulai mencoba membuat tulisan dalam blog saya menjadi lebih resmi. Jadi harap dimaklumi ketika banyak istilah yang coba saya Indonesia-kan dalam tulisan ini. Demikian tulisan saya, terus berbagi dan keep blogwalking teman-teman semua!~
Sumber:
http://hungred.com/useful-information/ways-optimize-sql-queries/