tenteng mySQL

A. SEJARAH MySQL
Pada awalnya, para pencipta MySQL mencoba suatu database server yaitu mSQL (mini Structure Query Language ) untuk menghubungkan table-tabel dengan menggunakan fast-low level ( ISAM ) routine mereka sendiri. Bagaimanapun, setelah beberapa test yang mereka lakukan, mereka berkesimpulan bahwa mSQL tidak begitu cepat dan tidak begitu fleksibel bagi kebutuhan mereka. Hal ini membuat mereka untuk dapat membuat suatu interface SQL baru yang sesuai dengan kebutuhan mereka dengan cara menambahkan atau memodifikasi dari mSQL dan mereka namakan MySQL. Adapun alasan mereka menambahkan kata ‘My’ pada MySQL sebenarnya masih sebuah misteri bagi mereka sendiri tapi hampir semua libraries dan tools pada direktori mereka memiliki awalan ‘My’. Juga nama adiknya ‘Monty’ ( salah satu pencipta MySQL ) diberi nama ‘My’.
B. Apa itu MySQL ?
– MySQL adalah sebuah system manajemen database. Database adalah sekumpulan data yang terstruktur. Data-data itu dapat suatu daftar belanja yang sangat sederhana sampai ke galeri lukisan atau banyaknya jumlah informasi pada jaringan perusahaan. Untuk menambah, mengakses dan memproses data yang tersimpan pada database komputer, kita membutuhkan manajemen database seperti MySQL.
– MySQL adalah sebuah system manajemen database yang saling berhubungan. Sebuah hubungan databse dari data yang tersimpan pada table yang terpisah daripada menyimpan semua data pada ruang yang sangat besar. Hal ini menambah kecepatan dan fleksibilitas. Table-tabel tersebut dihubungkan oleh hubungan yang sudah didefinisikan mengakibatkan akan memungkinkan untuk mengkombinasikan data dari beberapa table sesuai dengan keperluan.
– MySQL adalah ‘Open Source Software’. ‘Open Source’ maksudnya program tersebut memungkinkan untuk dipakai dan dimodifikasi oleh siapa saja. Semua orang bisa mendownload MySQL dari Internet dan memakainya tanpa membayar sepeser pun. Seseorang dapat mempelajari ‘ Source Code ‘ dan dapat mengubahnya sesuai dengan kebutuhan mereka. MySQL menggunakan GPL (GNU General Public License).
C. Mengapa Menggunakan MySQL ?
MySQL merupakan database yang sangat cepat, dapat diandalkan dan mudah untuk digunakan. Jika hal itu yang anda cari maka anda harus mencobanya. Selain itu, source programnya pun dapat anda dapatkan secara gratis dan syntax-syntaxnya mudah untuk dipahami dan tidak rumit serta pengaksesan database dapat dilakukan dengan mudah dan cepat.

D. Kelebihan – kelebihan MySQL
Selain karena Open Source program, MySQL juga memiliki kelebihan-kelebihan yang tak kalah bagusnya dengan Database Server lainnya, seperti SQL server, Sybase bahkan Oracle. Kelebihan-kelebihan itu antara lain :
 Dapat bekerja di beberapa platform yang berbeda, seperti LINUX, Windows, MacOS dll.
 Dapat dikoneksikan pada bahasa C, C++, Java, Perl, PHP dan Python.
 Memiliki lebih banyak type data seperti : signed/unsigned integer yang memiliki panjang data sebesar 1,2,3,4 dan 8 byte, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET dan tipe ENUM.
 Mendukung penuh terhadap kalimat SQL GROUP BY dan ORDER BY. Mendukung terhadap fungsi penuh ( COUNT ( ),COUNT (DISTINCT), AVG ( ), STD ( ), SUM ( ), MAX ( ) AND MIN ( ) ).
 Mendukung terhadap LEFT OUTHER JOIN dengan ANSI SQL dan sintak ODBC.
 Mendukung ODBC for Windows 95 (dengan source program). Semua fungsi ODBC 2.5 dan sebagainya. Sebagai contoh kita dapat menggunakan Access untuk connect ke MySQL server.
 Menggunakn GNU automake, autoconf, dan LIBTOOL untuk portabilitas.
 Kita dapat menggabungkan beberapa table dari database yang berbeda dalam query yang sama.
 Ditulis dengan menggunakan bahasa C dan C++. Diuji oleh compiler yang sangat jauh berbeda.
 Privilege (hak) dan password sangat fleksibel dan aman serta mengujinkan ‘Host-Based’ Verifikasi.
1. Tabel MySQL bukanlah array
Programmer PHP atau Perl tentu saja familiar dengan array dan hash, yang biasanya dipakai untuk menyimpan sekumpulan data terkait. Sebagian dari mereka yang tidak familiar dengan MySQL akan cenderung menganalogikan tabel database dengan array/hash (tepatnya, array of array atau array 2 dimensi). Tabel dipandang sama seperti sebuah array, hanya saja bisa berukuran besar sekali dan persisten (disimpan di disk).
Cara pandang ini tidak sepenuhnya salah, karena toh dalam mengambil record dari tabel biasanya ditampung ke dalam variabel array/hash. Hanya saja, cara pandang ini kadang-kadang membuat programer PHP melakukan sesuatu seperti:
$res = mysql_query(“SELECT * FROM t1”);
$rows = array();
while ($row = mysql_fetch_row($res)) $rows[] = $row;
echo “Jumlah record di tabel t1 = “, count($rows);
atau membuat tabel seperti:
CREATE TABLE t2 (
f0 INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
f1 INT UNSIGNED,
f2 VARCHAR(5),
f3 VARCHAR(200),
f4 VARCHAR(200),
f5 BLOB
);
Apa yang salah dengan kode PHP pertama di atas, yang bertujuan mencari jumlah record dalam sebuah tabel? Si programer, yang terlalu terobsesi menganggap tabel MySQL sebagai sebuah array, mencoba membangun dulu arraynya dengan mengisi satu-persatu elemen dari hasil query agar nantinya bisa menggunakan fungsi array count(). Masalahnya, bagaimana kalau jumlah record ada 100 ribu? 1 juta? 10 juta? Bukan itu saja, selesai di-count() variabel $rows langsung dibuang lagi! Padahal, ada cara yang jauh lebih efisien:
SELECT COUNT(*) FROM t1
Hasil querynya hanyalah sebuah record saja, tak peduli berapa pun ukuran tabel t1.
Lalu apa yang salah dengan kode SQL kedua? Si programer Perl, dalam hal ini, terobsesi ingin mengambil tiap record di tabel dengan fungsi DBI $sth->fetchrow_array()
@row = $sth->fetchrow_array();
print $row[0]; # f0
print $row[1]; # f1
print $row[2]; # f2
# …
Enak bukan? Elemen ke-0 berisi nilai field f0, elemen ke-1 field f1, dst. Masalahnya, kemudahan ini mengorbankan nama field yang menjadi sangat tidak deskriptif. Belum lagi kalau tabel perlu diubah dengan menyisipkan field-field lain di antara field yang sudah ada. Atau field-field lama perlu dihapus. Semuanya akan menjadi mimpi buruk.
Sebagian pembaca mungkin geleng-geleng kepala. Apa benar ada programer PHP dan Perl yang melakukan kedua hal di atas? Percaya deh, ada. Saya pernah harus ketiban getah memaintain tabel dengan nama field kriptik seperti ini.
2. Bahasa SQL dan Fungsi-Fungsi MySQL
MySQL adalah database SQL bukan? Sayangnya, programer PHP pemula kadang terbatas sekali pengetahuan SQL-nya. Padahal, untuk menggunakan database MySQL dengan efektif, ia tidak boleh malas mempelajari bahasa kedua, yaitu SQL. Jika tidak belajar SQL, maka ada kemungkinan Anda akan melakukan hal-hal seperti:
$res = mysql_query(“SELECT * FROM bigtable”);
while ($row = mysql_fetch_assoc($res)) {
if ($row[‘age’] >= 40) {
echo “Ditemukan kustomer yang berusia lebih dari 40 tahun!\n”;
break;
}
}
Apa salah kode di atas? Si programer PHP mencoba mensimulasikan klausa WHERE SQL dengan melakukan pengujian kondisi di kode PHP. Padahal, yang seharusnya dilakukan adalah:
SELECT * FROM bigtable WHERE age >= 40
Ini amat mengirit trafik client/server karena tidak semua record harus dikirimkan dari MySQL ke program PHP Anda.
Sebagian pembaca mungkin geleng-geleng kepala. Apa benar ada programer PHP yang seperti ini? Percaya deh, ada.
SQL sudah menyediakan cara untuk menyortir data, memformat tampilan, mengelompokkan dan memfilter record, dsb. MySQL juga terkenal banyak menyediakan fungsi-fungsi, mulai dari manipulasi tanggal, angka, string, dsb. Kenali SQL dan fungsi-fungsi MySQL; jangan duplikasikan ini semua di PHP sebab akan lebih efisien jika dilakukan di level MySQL.
Ini contoh lain programer PHP yang tidak memanfaatkan fasilitas dari MySQL:
$res = mysql_query(“SELECT * FROM customers”);
while ($row = mysql_fetch_assoc($res)) {
# format semula yyyy-mm-dd…
preg_match(“/(\d\d\d\d)-(\d\d?)-(\d\d?)/”, $row[date], $matches);
# … dan ingin dijadikan dd/mm/yyyy
$tanggal = “$matches[3]/$matches[2]/$matches[1]”;
echo “Nama=$row[name], Tanggal lahir=$tanggal
\n”;
}
Padahal MySQL sudah menyediakan fungsi pemformatan dan manipulasi tanggal:
$res = mysql_query(“SELECT name, DATE_FORMAT(date,’%d-%m-%Y’) as tanggal “.
“FROM customers”);
while ($row = mysql_fetch_assoc($res)) {
# tidak perlu capek-capek manipulasi string lagi…
echo “Nama=$row[name], Tanggal lahir=$row[tanggal]
\n”;
}
Poin no. 2 ini kedengarannya klise, tapi, seperti nasihat Inggris bilang: know thy tools.
3. LIMIT, LIMIT, LIMIT
Salah satu alasan mengapa MySQL sangat cocok untuk aplikasi Web adalah mendukung klausa LIMIT. Dengan klausa ini, mudah sekali membatasi jumlah record hasil yang diinginkan dalam satu perintah SQL. Tidak perlu bermain kursor atau bersusah payah lewat cara lainnya. Belakangan database lain seperti PostgreSQL dan Firebird pun ikut mendukung fungsionalitas LIMIT (dengan sintaks yang tidak persis sama tentunya).
Sayangnya, programer PHP sendiri yang belum mengenal MySQL dengan baik tidak menggunakannya dengan semestinya.
$res = mysql_query(“SELECT name FROM users ORDER BY date”);
$rows = array();
for ($i=1; $i ‘nilai tertentu’). [Catatan: ada indeks lain yang “tidak biasa” di MySQL, yaitu FULLTEXT. Tapi ini di luar cakupan artikel kita kali ini.]
* Field jenis kelamin mungkin tidak perlu diindeks, kecuali jika perbandingan pria:wanita amat drastis bedanya. Mengapa? Sebab: 1) rentang nilai yang ada hanyalah dua: L (lelaki) dan P (perempuan). Meskipun Anda beri indeks, tidak akan memperbaiki kinerja.
7. Konkurensi, Locking, dan Transaksi
Programer web pemula kadang-kadang tidak menyadari bahwa program/skrip yang dibuatnya tidaklah seperti program desktop yang dijalankan oleh satu user. Melainkan, dalam satu waktu bisa saja ada 10 atau 100 user yang “menembak” skrip Anda di Web. Karena itu, isu locking dan konkurensi penting sekali. Contohnya adalah seperti ini:
$res = mysql_query(“SELECT value FROM counters WHERE name=’counter1′”);
list ($value) = mysql_fetch_row($res);
$value++;
// do something else first…
$res = mysql_query(“UPDATE counter SET value=$value WHERE name=’counter1′”);
Di antara baris pertama (saat kita mengambil nilai record) dan baris keempat (saat kita menaruh kembali nilai dalam record) mungkin saja telah terjadi beberapa kali perubahan terhadap si record. Misalnya, pada baris pertama klien1 memperoleh nilai $value = 100. Di baris 3 $value di-increment menjadi 101. Tapi apa yang terjadi jika selama selang waktu itu nilai record counter1 telah menjadi 103 (karena misalnya klien2, klien3, dan klien4 telah meng-incrementnya)? Oleh si klien1, counter1 direset kembali menjadi 101 dan akibatnya increment oleh klien2, klien3, dan klien4 hilang. Seharusnya nilai counter1 menjadi 104.
Untuk kasus di atas, pemecahannya cukup gampang. Lakukan increment secara atomik:
// tidak perlu ambil nilai counter dulu…
// do something else first…
$res = mysql_query(“UPDATE counter SET value=value+1 WHERE name=’counter1′”);
Tapi dalam kasus lain, kadang-kadang kita harus melakukan locking terhadap tabel atau record untuk menjamin bahwa selama kita // do something else… klien2, klien3, dan klien4 tidak bisa seenaknya menaikkan nilai counter:
mysql_query(“LOCK TABLES cuonters”);
$res = mysql_query(“SELECT value FROM counters WHERE name=’counter1′”);
list ($value) = mysql_fetch_row($res);
// do something else first… increase value or something…
$res = mysql_query(“UPDATE counter SET value=$value WHERE name=’counter1′”);
mysql_query(“UNLOCK TABLES”);
atau (lebih baik karena kita tidak perlu melock keseluruhan tabel):
mysql_query(“SELECT GET_LOCK(‘lock1’)”);
$res = mysql_query(“SELECT value FROM counters WHERE name=’counter1′”);
list ($value) = mysql_fetch_row($res);
// do something else first… increase value or something…
$res = mysql_query(“UPDATE counter SET value=$value WHERE name=’counter1′”);
mysql_query(“SELECT RELEASE_LOCK(‘lock1’)”);
Ingat, locking dapat berakibat samping yaitu deadlock.
Transaksi. Transaksi pun sesuatu yang dipergunakan secara meluas di dunia database, tapi hampir tidak pernah kita jumpai di bahasa pemrograman (ini karena data di bahasa pemrograman ditaruh dalam variabel di memori semua; tidak ada isu disk yang crash/lambat/rusak/harus disinkronkan dengan data di memori). Karena itu Anda perlu memahami konsep ini dari buku-buku tentang database.
8. Jenis Tabel
Di MySQL dikenal istilah table handler dan jenis tabel. Saat ini ada 3 jenis tabel utama yang bisa dipakai di MySQL: MyISAM (default), BerkeleyDB, dan InnoDB. Yang perlu diketahui ada tiga hal: 1) tidak semua tabel mendukung transaksi (MyISAM tidak mendukung transaksi, jadi COMMIT dan ROLLBACK tidak melakukan sesuatu yang semestinya jika Anda menerapkan pada tabel MyISAM); 2) tidak semua tabel punya karakteristik performance yang sama (BerkeleyDB misalnya, lambat jika ukuran tabel besar) dan disimpan dengan cara yang sama (tabel MyISAM misalnya disimpan dalam 3 file: .MYI, .MYD, .frm sementara tabel-tabel dan database-database InnoDB disimpan bersama dalam daerah disk yang disebut tablespace; 3) distribusi MySQL yang bukan -Max tidak dikompile dengan dukungan terhadap BerkeleyDB dan InnoDB.
Nomor 3 penting Anda ketahui karena jika kita menginstruksikan MySQL untuk membuat database dengan jenis tertentu:
CREATE TABLE (…) TYPE=BDB;
Dan MySQL tidak dikompile untuk mendukung BerkeleyDB, maka MySQL tidak akan protes dengan error, melainkan membuatkan tabel tersebut untuk kita tapi dengan tipe default yaitu MyISAM. Jadi Anda perlu mengecek dulu menggunakan SHOW TABLE STATUS:
mysql> create table t4 (i int) type=innodb;
Query OK, 0 rows affected (0.00 sec)

mysql> show table status from mydb like ‘t4’;
+——+——–+-…
| Name | Type | …
+——+——–+-…
| t4 | MyISAM | …
+——+——–+-…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: