• Tidak ada hasil yang ditemukan

Optimasi MySQL variable

Dalam dokumen Module MySQL-MariaDB FundamentalAndAdvanced (Halaman 136-142)

MySQL secara default menggunakan konfigurasi moderate, dalam arti bahwa konfigurasi yang yang diberikan merupakan konifgurasi yang menyesuaikan dengan sistem server secara umum. Ada penyesuaian antara performa dengan stabilitas. Tidak diset performa tinggi agar tidak mempengaruhi stabilitas sistem.

Untuk parameter yang ditune up, tidak perlu dihapalkan satu persatu, karena MySQL sudah menyediakannya pada folder /usr/share/mysql. Pada folder tersebut ada nama file konfigurasi : my-small.cnf, my-medium.cnf, my-large.cnf dan my-huge.cnf yang dapat digunakan sebagai template konfigurasi.

Pada bagian ini yang akan dibahas adalah Optimasi MySQL variable. Yaitu kita akan men-edit variable-variable bawaan dari instalasi awal MySQL. Karena secara default settingan variable MySQL adalah memungkinkan untuk berjalan dikomputer minim resource (spesifikasi hardware rendah), untuk kebutuhan production/live terlebih lagi apabila spesifikasi hardware Database Server kita tinggi, maka hal ini tentunya kurang relevan lagi.

Proses edit variable MySQL bisa dengan berbagai cara, tapi yang akan kita pakai adalah langsung mengedit file my.ini (windows) atau my.cfg (linux). Harap mematikan terlebih dulu service MySQL apabila sendang berjalan, masuk ke commandline (cmd) Windows/Linux, ketik :

mysqladmin -u[username] -p[password] shutdown

Untuk mengeksekusi perintah diatas, pastikan mysql console telah terdaftar di

Environment Variable Windows, dan user yang digunakan memiliki hak Akses penuh

(sysdba). Kemudian silakan ke folder instalasi MySQL, kemudian cari file my.ini (my.cfg) Contoh lokasinya.

Besaran dari nilai yang akan dirubah bergantung kepada kebutuhan dan karakter dari aplikasi yang menggunakan database tersebut, hampir tiap aplikasi / CMS mempunyai karateristik dan value settingan yang berbeda sehingga tidak ada nilai pasti dalam melalukan perubahan nilai pada variable konfigurasi MySQL.

Berikut ini adalah variable-variable yang sering digunakan untuk tuning:

1. max_connections

Adalah maksimum sambungan yang dapat dilakukan dalam waktu sekaligus, kalau website termasuk sangat sibuk, semakin besar tentunya akan semakin bagus, akan tetapi sudah pasti bahwa karena resource server akan semakin banyak dipakai maka CPU atau memory akan semakin termakan oleh proses MySQL.

Oleh karena itu, nilai max_connections dapat disinkronkan dengan besar memory server dan akses maksimum Apache server pada bagian MaxClient. Tidak ada artinya memperbesar nilai tersebut namun pada MaxClient di Apache nilainya masih sangat kecil, misalnya hanya sekitar 50 sambungan saja. Nilai defaultnya adalah 151 (mariadb)

SHOW VARIABLES WHERE Variable_name = 'max_connections' ;

+---+---+ | Variable_name | Value | +---+---+ | max_connections | 151 | +---+---+ 2. query_cache_size

Apabila MySQL server sibuk dan selalu mengulang-ulang query yang sama, maka settting query_cache_size perlu diperhatikan. query_cache_size akan menyimpan query yang berulang, sehingga akan mempercepat kerja MySQL untuk query yang sama. Karena query yang sebelumnya disimpan dalam memory cache. Nilai defaultnya adalah 0 (mariadb)

SHOW VARIABLES WHERE Variable_name = 'query_cache_size' ;

+---+---+ | Variable_name | Value | +---+---+ | query_cache_size | 0 | +---+---+ 3. key_buffer_size

Data base menggunakan key index. Karena itu apabila index ini tersimpan dalam satu memori secara utuh, maka sudah tentu proses MySQL server akan semakin cepat untuk mendapatkan hasil dari query yang diinginkan. Secara ideal semua index akan bagus tersimpan dalam memory ini, akan tetapi perlu juga melihat kemampuan kapasitas memory server.

Untuk kebutuhan table yang menggunakan engine MyISAM. Max 25% dari total memory (RAM) Hardware dalam satuan MB, misal memory server 3GB (3002 MB * 25%=

750,5 MB) maka bisa di edit menjadi 750M. apabila tidak ada table MyISAM sebaiknya disetting menjadi 16-32M. Nilai defaultnya adalah 128MB (mariadb)

SHOW VARIABLES WHERE Variable_name = 'key_buffer_size' ;

+---+---+ | Variable_name | Value | +---+---+ | key_buffer_size | 134217728 | +---+---+ 134217728 bytes = 128MB

4. table_cache (mysql) table_open_cache (mariadb)

Apabila MySQL server banyak menggunakan table query, maka besar memori pada konfigurasi ini juga perlu di perhatikan. Karena akan mempercepat proses query yang berhubungan dengan table. Nilai defaultnya adalah 400 (mariadb)

SHOW VARIABLES WHERE Variable_name = 'table_open_cache' ;

+---+---+ | Variable_name | Value | +---+---+ | table_open_cache | 400 | +---+---+ 5. sort_buffer_size

Apakah MySQL server memiliki query atau operasi myisamchk atau sort ? Maka option ini sangat penting untuk di perhatikan. Dengan memasang buffer yang besar tentunya akan melakukan sorting secara besar juga. Memperbesar pada nilai ini akan mempercepat sorting. Nilai defaultnya adalah 2MB (mariadb)

SHOW VARIABLES WHERE Variable_name = 'sort_buffer_size' ;

+---+---+ | Variable_name | Value | +---+---+ | sort_buffer_size | 2097152 | +---+---+

Pengetesan, pertama buat table dengan menggunakan Storage engine myisamchk

CREATE TABLE `sorttest` (

`data` char(30) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

SHOW TABLES;

+---+ | Tables_in_test | +---+ | sorttest |

+---+

Dan tambahkan 100k row dengan menggunakan bash script ini

#!/bin/bash NUMROW=100000 COUNT=0

while [ "$NUMROW" -gt "$COUNT" ] do

UUID=`uuidgen`

mysql -u root -p'password' test -e "insert into sorttest value ('$UUID');"

let "COUNT=COUNT+1" done

SELECT count(*) FROM sorttest;

+---+ | count(*) | +---+ | 100000 | +---+

Setelah 100k row terbuat, dilanjutkan dengan melakukan pengetesan dengan menggunakan bash script dibawah ini

#!/bin/bash

for i in `seq 1 1000` do

START=`date +%s.%N`

OUT=`mysql -uroot -p'password -e "set session sort_buffer_size=32*1024*$i;select * from sorttest order by data

limit 78000,1;show session status like

'Sort_merge_passes';select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;select * from sorttest order by data limit 78000,1;" test`

END=`date +%s.%N`

MERGE=`echo $OUT | cut -d' ' -f6` TIME=`echo "$END - $START" | bc` echo "$i $MERGE $TIME"

sort_buffer_size=32*1024*100

sort_buffer_size=1024*1024*100

sort_buffer_size=4096*1024*100

6. read_rnd_buffer_size

read_rnd_buffer_size digunakan setelah client melakukan sorting. Yaitu untuk memproses row dari query sorting yang telah kita lakukan. Apabila query server sering memakai ORDER BY, maka option ini perlu diperhatikan. Cara menghitung besar buffer ini dengan logika 1 MB adalah 1KB, jadi apabila memory server adalah 1GB, maka dapat merubahnya menjadi sebesar 1MB. Nilai defaultnya adalah 256KB (mariadb)

SHOW VARIABLES WHERE Variable_name = 'read_rnd_buffer_size' ;

+---+---+ | Variable_name | Value | +---+---+ | read_rnd_buffer_size | 262144 | +---+---+

7. thread_cache (mysql) thread_cache_size (mariadb)

Apabila server sibuk dengan banyaknya query dan memerlukan respon yang sangat cepat, maka thread_cache/thread_cache_size adalah option yang perlu perhatikan. Karena jika semakin besar nilai ini, akan semakin tinggi juga load CPU server.

SHOW VARIABLES WHERE Variable_name = 'thread_cache_size' ;

+---+---+ | Variable_name | Value | +---+---+ | thread_cache_size | 0 | +---+---+ 8. tmp_table_size

tmp_table_size akan memberikan kesempatan kepada MySQL untuk menyimpan table ke dalam harddisk yang dianggap sebagai memory. Sudah tentu tmp_table_size akan memperlambat kecepatan MySQL. Apabila server mempunyai memory yang minim dan kecepatan MySQL tidak begitu diperhitungkan, barangkali ini adalah option yang dapat digunakan. Nilai defaultnya adalah 16MB (mariadb)

SHOW VARIABLES WHERE Variable_name = 'tmp_table_size' ;

+---+---+ | Variable_name | Value | +---+---+ | tmp_table_size | 16777216 | +---+---+

Bagaimana cara menghitung memory yang diperlukan oleh MySQL Server dengan mudah ? Gunakan rumus sederhana berikut ini.

memory=key_buffer+(sort_buffer_size+read_buffer_size)*max_connections

9. innodb_buffer_pool_size

Untuk kebutuhan table yang menggunakan engine InnoDB. Cara menghitung maximalnya adalah 70% dari total memory (RAM) Hardware dalam satuan MB, semisal memory adalah 3GB (3002 MB * 25%= 2101,4 MB) maka kita dapat merubah nilainya menjadi 2101M. Nilai defaultnya adalah 128MB (mariadb)

SHOW VARIABLES WHERE Variable_name = 'innodb_buffer_pool_size' ;

+---+---+ | Variable_name | Value | +---+---+ | innodb_buffer_pool_size | 134217728 | +---+---+

10.read_buffer_size

Cara menghitungnya adalah dengan membagi 2 nilai dari sort_buffer_size, adapun nilai defaultnya adalah 128KB (mariadb)

SHOW VARIABLES WHERE Variable_name = 'read_buffer_size' ;

+---+---+ | Variable_name | Value | +---+---+ | read_buffer_size | 131072 | +---+---+ 11.innodb_flush_log_at_trx_commit

Konfigurasi pada valui ini hanya opsional, apabila edit menjadi 0 (nol) bisa menjadi sedikit lebih cepat, namun kekurangannya adalah memungkinkan untuk kehilangan data yang sedang ditransaksikan apabila server crash.

SHOW VARIABLES WHERE Variable_name = 'innodb_flush_log_at_trx_commit' ; +---+---+

| Variable_name | Value | +---+---+ | innodb_flush_log_at_trx_commit | 1 | +---+---+

Dalam dokumen Module MySQL-MariaDB FundamentalAndAdvanced (Halaman 136-142)

Dokumen terkait