Mengoptimalkan kecepatan query Mysql

10 Tips Untuk Mempercepat Akses Database MySQL

Relational Database Management System erat kaitannya dengan pengembangan aplikasi yang dinamis. Karena dinamis, database memegang peranan yang vital dalam proses berjalannya sebuah logika program. Untuk itu, performa dari sebuah database sangat menentukan kelancaran kerja sebuah aplikasi dinamis. Yang mempengaruhi kecepatan akses sebuah database tidak hanya masalah hardware yang digunakan. Kita bisa juga meningkatkan performa dari sebuah query ke database dengan beberapa trik. Berikut tip-tip mempercepat query SQL pada RDBMS open-source yang paling banyak dipakai saat ini, MySQL.

images.jpg

Desain database Anda dengan benar

Mungkin terdengar sangat standar, tetapi nyatanya banyak masalah yang timbul berkenaan dengan database yang bersumber dari disain awal yang buruk. Bisa dibilang, pondasi yang buruk akan mnyebabkan masalah-masalah lain yang kadang lebih buruk.
Sebagai seorang programer pemula, kadang kita terbiasa menyimpan informasi, semisal informasi client dan informasi pembayaran client di field yang berbeda pada tabel yang sama. Hal ini bukan hal yang baik bagi jika ditinjau dari database system. Dan juga akan menjadi pekerjaan yang berat bagi developer yang akan memaintance program selanjutnya. Selalu simpan informasi yang berbeda pada tabel yang terpisah.
Ketika akan membuat database, selalu simpan informasi berbeda di tabel yang berbeda, gunakan standar penamaan yang jelas dan gunakan primary key.

Source: http://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/

Tahu apa yang harus Anda optimasi
Saat berinteraksi dengan sebuah databasem, berarti kita sedang membicarakan query. Sebelum memutuskan untuk mengoptimasi query tertentu, hal yang sangat perlu diperhatikan adalah kita tahu informasi tentang query tersebut.  Anda bisa menggunakan perintah EXPLAIN untuk mendapatkan informasi dari query yang Anda jalankan. Untuk lebih jelasnya perhatikan contoh penggunaanya di bawah ini:

EXPLAIN SELECT * FROM ref_table, table_lain WHERE ref_table.key_column = table_lain.column;

Source: http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

Gunakanlah quey yang tercepat
Query tercepat adalah sebuah query yang tidak pernah Anda kirim. Maksudnya? Saat Anda mengirimkan sebuah query ke database, sumber daya server Andalah yang kan menanganinya, karena memang itulah tugasnya. Inilah poin penting dalam memilih query yang tercepat. Untuk website dengan traffic tidak sampai 100 visitor perhari mungkin tidak akan berpengaruh banyak. Tetapi untuk website dengan traffic tinggi, hal terbaik yang dapat Anda lakukan untuk mempercepat performa database Anda adalah dengan cara cache queries.
Banyak alternatif cara untuk melakukan cache query pada server website Anda, beberapa diantaranya adalah sebagai berikut:

  1. AdoDB
    AdoDB adalah sebuah abstraction layer library database untuk bahasa pemrograman PHP. Tools ini menyediakan kemungkinan untuk menggunakan sistem database sesuai dengan relevansi Anda. Misalnya MySQL, PostgreSQL, Interbase, dan lain sebagainya. Dan yang terpenting tools ini memang dirancang untuk bekerja dengan kecepatan. Arsitektur AdoDB sangat sederhana, tetapi dengan performa sistem caching yang powerful. Selain itu, AdoDB dilisensikan dibawah lisensi BSD. Hal ini berarti end user dapat dengan bebas mengunakannya pada proyeknya masing-masing. Untuk keperluan komersial, lisensi LGPL yang akan diseiakan.
  2. Memcached
    Cara berikut untuk mencache query adalah dengan metode memcached. Memcached adalah sistem caching memori terdistribusi yang sering dipakai untuk mempercepat website berbasis database dinamis dengan meringankan beban database.
  3. CSQL Cache
    CSQL Cache adalah sebuah open-source data caching infrastruktur. Saya sendiri belum pernah menggunakan metode ini, namun tidak ada salahnya mencoba performanya.

Tampilkan hanya data yang perlu ditampilkan
Query SELECT yang paling umum digunakan adalah SELECT * FROM. Padahal dalam kenyataanya mungkin Anda hanya perlku menampilkan beberapa field saja. Simbol * menunjukkan bahwa Anda ingin menampilkan semua field yang tersedia.

SELECT * FROM wp_posts;

Daripada membuang-buang resource untuk data yang tidak kita butuhkan, sebaiknya pilihlah hanya filed atau kolom yang memang Anda butuhkan. Seperti query berikut ini:

SELECT judul, kutipan, pengarang FROM wp_posts;

Efek dari query ini tidak akan terlihat secara signifikan untuk website dengan traffic kecil. Tetapi akan sangat terasa perbedaannya saat digunakan pada website dengan traffic tinggi. Karena hal ini bergantung pada intensitas query yang dilakukan.
Selalu gunakan LIMIT
Batas. Selalu batasi record yang ingin Anda tampilkan. Terkecuali memang Anda perlu untuk menampilkan keseluruhan data dalam sebuah tabel. Kenyataannya, lebih sering Anda hanya mendapatkan jumlah record tertentu dari database Anda. Contohnya blog saya ini, pada halaman beranda hanya akan menampilkan 5 entri terbaru. Untuk keperluan ini, saya harus benar-benar menggunakan parameter LIMIT, yang hanya akan menampilkan jumlah record yang diperlukan. Jika query Anda tidak disertai LIMIT, maka jika sebuah tabel memiliki 100.000 record berbeda, server website Anda akan bekerja sangat keras dengan hasil yang sebenarnya tidak perlu untuk ditampilkan.

SELECT judul, kutipan, pengarang FROM wp_posts LIMIT 10;

Hindari queries dalam pengulangan
MySQL adalah pasangan mesra PHP. Saat menggunakannya secara bersamaan, seringkali seorang programer akan tergoda melakukan SQL query dalam sebuah looping (perulangan). Sebanyak perulangan itu terjadi, sebanyak itulah query akan dijalankan. Hal ini ibarat menugaskan server untuk bekerja berulang-ulang, untuk sebuah tugas yang bisa diringkas sekali jalan. Contoh kasusnya adalah seperti ini::

foreach ($display_order as $id => $urut) (
 $sql = “UPDATE SET kategori display_order = $ordinal WHERE id = $id”;
 mysql_query ($sql);
)

Bukan sebuah kesalahan sebenarnya, tetapi ada langkah yang lebih bijak untuk kasus di atas. Perhatikan query dibawah ini:

UPDATE kategori
 SET display_order = CASE id
 WHEN 1 THEN 3
 WHEN 2 THEN 4
 WHEN 3 THEN 5
 END
WHERE id IN (1,2,3)

Source: http://www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different-values-and-a-single-sql-query/

Prioritaskan JOIN bukannya subqueries
Subqueries adalah sesuatu yang kadang menarik untuk dilakukan. Untuk kasus-kasus tertentu, sepertinya metode ini adalah jalan terakhir untuk menyelesaikan masalah. Namun, sebagai seorang programmer, subqueries adalah sesuatu yang bisa menggoda Anda menyalahgunakannya. Seperti terlihat dibawah ini, subqueries bisa sangat membantu seorang programer:

SELECT a.id,
(SELECT MAX (created)
FROM posts
WHERE author_id = a.id)
AS latest_post FROM authors a

Tetapi tahukah Anda? Subqueries memang berguna, tetapi perannya sebenarnya masih bisa digantikan dengan perintah JOIN, dengan performa yang jelas lebih cepat dari subqueries. Perhatikan contoh berikut:

SELECT a.id, MAX (p.created) AS latest_post
 FROM authors a
 INNER JOIN posts p
 ON (a.id = p.author_id)
GROUP BY a.id

Source: http://20bits.com/articles/10-tips-for-optimizing-mysql-queries-that-dont-suck/

Berhati-hatilah menggunakan wildcard
In case you don’t know, wildcard (%….%) adalah fasilitas untuk searching. Fasilitas ini sangat berguna saat kita hendak melakukan pencarian dalam sebuah field. Wildcard dapat berperan dalam menggantikan satu atau lebih karakter ketika kita mencari data dalam sebuah database. Bukan tidak boleh menggunakannya, tetapi Anda harus berhati-hati dalam menggunakannya. Gunakan jika memang sangat diperlukan. Jika memungkinkan, gunakan awalan atau postfix wildcard atau akhiran (prefix) wildcard untuk melakukan pencarian sebuah data.
Alasannya dalah, full wildcard akan menampilkan kemungkinan yang lebih banyak jika dibandingkan dengan postfix wildcard. Perhatikan contoh query dibawah ini:

# Full wildcard
 SELECT * FROM table WHERE COLUMN LIKE ‘%halo%’;
 # Postfix wildcard
 SELECT * FROM TABEL WHERE COLUMN LIKE ‘halo%’;
 # Prefix wildcard
SELECT * FROM TABEL WHERE COLUMN LIKE ‘% hello’;

Source: http://hungred.com/useful-information/ways-optimize-sql-queries/

Pertimbangkan untuk menggunakan UNION daripada OR
UNION dan OR adalah perintah yang identik. Keduanya dapat digunkan untuk menggaungkan hasil dari dua atau lebih query. Mari kita bandingkan satu persatu dua query ini. Yang pertama menggunakan OR:

SELECT * FROM a, b WHERE a.p = b.q OR a.x = b.y;

Apakah tidak ada alternatif lain yang lebih baik? Perhatikan contoh berikut ini, yang akan mengembalikan hasil yang sama seperti perintah di atas, tetapi akan lebih cepat:

SELECT * FROM a, b WHERE a.p = b.q
UNION
 SELECT * FROM a, b WHERE a.x = b.y

Source: http://www.bcarter.com/optimsql.htm

Selalu gunakan Index
Index adalah kunci dari sebuah tabel. Index dalam konteks perpustakaan: Memungkinkan untuk mempercepat pencarian sebuah judul buku berdasarkan ISBN, kode buku, atau nomer buku yang sudah terdata sebelumnya.
Index database berguna untuk menemukan informasi yang diminta lebih cepat, seperti sebuah indeks perpustakaan akan memungkinkan seorang pembaca untuk menemukan apa yang mereka cari tanpa menghabiskan waktu. Index dapat dibuat pada satu kolom atau kombinasi kolom dalam tabel database. Sebuah index tabel adalah struktur database yang mengatur nilai-nilai dari satu atau lebih kolom dalam tabel database dalam urutan tertentu.
Pertanyaan berikut ini akan membuat index pada Model kolom dari tabel Produk. Index disebut idxModel:

http://setoelkahfi.web.id/10-tips-untuk-mempercepat-akses-database-mysql/

http://www.sql-tutorial.com/sql-indexes-sql-tutorial/

CREATE INDEX idxModel ON Product (Model);
Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s