Jumat, 12 Oktober 2012

SQL

Kita lanjutkan pembahasan pada artikel sebelumnya. Jika sebelumnya kita sudah menjelaskan optimasi1 dan 2, kita akan melanjutkan pada optimasi 3.
Optimasi 3: Menjalankan OPTIMIZE TABLE
Jika tabel Anda mengalami banyak perubahan setelah operasi UPDATE, atau DELETE, menjalankan OPTIMIZE TABLE pada saat maintenance dapat menaikkan performa maupun  memperkecil ukuran data secara cukup signifikan pada beberapa kasus. Sintaksnya sebagai berikut:
OPTIMIZE TABLE nama_table
Optimasi 4: SQL Statement
Mengelola SQL statement (query) merupakan seni tersendiri  dengan ruang lingkup yang sangat luas, terkadang memerlukan trik khusus, bergantung pada kondisi dan kasus yang dihadapi, misalnya perintah ORDER BY yang cukup lazim digunakan. Ambil contoh kasus Anda memiliki tabel transaksi lalu ingin melihat sepuluh transaksi terakhir yang terjadi. Query yang Anda buat bisa jadi seperti ini:
SELECT customer, tanggal form tbl_transaksi ORDER By tanggal DESC LIMIT 0.10
Perhatikan ORDER BY tanggal DESC, yang berfungsi untuk mengurutkan data berdasarkan tanggal secara DESCENDING (dari besar ke kecil) dengan tujuan menampilkan tanggal terbaru. Untuk data yang besar, waktu eksekusi yang diperlukan  cukup menyita waktu, bahkan jika waktu yang diperlukan masih dalam hitungan detik (katakanlah sekitar sepuluh detik), Anda harus memikirkan optimasinya. Bayangkan jika ribuan pengguna aplikasi web mengeksekusi query yang masing-masing memakan waktu sepuluh detik, tentunya akan mempengaruhi performa secara keseluruhan.
Untuk menganalisis query lebih lanjut, Anda dapat menggunakan EXPLAIN, Contoh:
EXPLAIN SELECT customer, tanggal FROM tbl_transaksi ORDER BY tanggal DESC LIMIT 0,10
Jika perintah di atas dijalankan pada phpMyAdmin akan didapat tampilan sebagai berikut:
Query sebelum optimasi
+ Options
id
select_type
table
type
possible_keys
key
key_len
ref
rows
Extra
1
SIMPLE
tbl_transaksi
ALL
NULL
NULL
NULL
NULL
205785
Using filesort
Terlihat bahwa rows (baris data) yang dibaca  berjumlah 205.785. Semakin banyak jumlah data tentu akan mempengaruhi performa, sementara data yang ingin ditampilkan sebenarnya hanya sebanyak sepuluh data. Solusinya adalah Anda harus menemukan cara lain untuk menampilkan sepuluh data terakhir, yaitu menggunakan field ID unik (primary sekaligus index) yang umumnya terdapat pada tabel transaksi. Jika ID tersebut auto-increment, record terakhir  pasti merupakan record dengan ID dengan nilai terbesar. Oleh karena itu, query sebelumnya dapat dioptimasi menjadi:
SELECT customer, tanggal FROM tbl_transaksi ORDER BY id DESC LIMIT 1,10
Jika dianalisis dngan menggunakan EXPLAIN, query akan terlihat seperti berikut ini:
Query setelah optimasi
+ Options
id
select_type
table
type
possible_keys
key
key_len
ref
rows
Extra
1
SIMPLE
tbl_transaksi
index
NULL
PRIMARY
4
NULL
10
Karena field id terindex, perintah ini akan dijelaskan jauh lebih cepat dan hanya membaca sebanyak sepuluh record.
Pisahkan query-query yang dirasakan memerlukan optimasi karena terlalu kompleks ataupun memerlukan waktu lama saat dieksekusi lalu analisis lebih lanjut. Pikirkan untuk memecah query menjadi bagian lebih kecil dan sederhana. Terkadang dengan melihat query dalam bentuk yang lebih sederhana, Anda dapat melihat lebih jelas bagian mana yang perlu dioptimasi. Juga jangan memaksakan satu query yang dieksekusi lebih lambat jika dapat dipecah menjadi beberapa query yang lebih cepat. 
Hindari juga penggunaan SELECT * FROM nama_table yang akan mengambil seluruh field (diwakili dengan karakter asyerisk atau *). SELECT * memang mudah dituliskan , tetapi akan lebih baik jika Anda menuliskan field-field yang diinginkans aja, misalnya SELECT id, nama, alamat FROM nama_table yang berarti hanya mengambil tiga field yang ditentukan (id, nama, dan alamat).
Optimasi SQL statement tidak terbatas hanya pada SELECT, tetapi juga pada INSERT, UPDATE, dan DELETE (atau disebut juga DML-Data Manipulation Language). Sebagai contoh, ada tiga perintah INSERT di bawah ini untuk memasukkan tiga record (row):
INSERT INTO tbl_produk (kode, nama_barang, harga) VALUES ('A001', 'abc', 10000); 
INSERT INTO tbl_produk (kode, nama_barang, harga) VALUES ('B001', 'xyz', 20000);
INSERT INTO tbl_produk (kode, nama_barang, harga) VALUES ('C003', 'ggg', 50000);
 Akan lebih baik membuat perintah di atas menjadi hanya sebuah INSERT yang memasukkan banyak record sekaligus, seperti di bawah ini:
INSERT INTO tbl_produk (kode, nama_barang, harga) VALUES
('A001', 'abc', 10000),
('B001', 'xyz', 20000),
('C003','ggg', 50000),
Optimasi 5: Mempertimbangkan Full-Text Search
Sebagai contoh, database Anda menyimpan teks/artikel ataupun terdapat banyak query yang menggunakan LIKE yang disusul dengan wildcard, contohnya:
SELECT judul, konten FROM tbl_artikel WHERE konten LIKE '%komputer%'
Anda dapat mempertimbangkan penggunaan Full-Text Search, yang pada dasarnya merupakan index, yang dilakukan pada kumpulan teks. Query pada contoh di atas sendiri tidak dianjurkan karena operator penggunaan wildcard (karakter %) memerlukan waktu yang relatif lama.  
Untuk mengubah struktur tabel agar field konten pada contoh di atas menjadi full-text, Anda dapat menggunakan perintah ALTER TABLE seperti contoh berikut:
ALTER TABLE tbl_artikel ADD FULLTEXT (konten)
Setelah itu, Anda dapat menuliskan query sebagai pengganti query sebelumnya:
SELECT judul, konten FROM tbl_artikel WHERE  match (konten) AGAINST ('komputer')
Selain beberapa tip optimasi di atas, perlu juga diperhatikan apakah optimasi bisa dilakukan pada sisi administrator database yang memiliki akses melakukan konfigurasi seperti mengatur penggunaan memory, cache, dan permasalahan tuning lainnya. Upgrade hardware juga perlu direncanakan jika Anda memiliki server database sendiri.
Oleh: Joko Nurjadi/PCMedia

1 komentar: