08 Mei 2012
8 Hal Yang Harus Diketahui Seorang Programmer Tentang Mysql
Php+Mysql. Siapa yang tidak tahu bahwa duosejoli ini adalah pasangan
terpopuler didunia open soure, bahkan diseluruh internet. Php telah
menggeser Perl sebagai bahasa dalam membuat aplikasi Web, terutama
pemula. Bahkan sebeltulnya Mysql juga banyak memiliki kekurangan dalam
ahal fitur SQL. Sehingga programmer Php tidakbisa memahami dan
memanfaatkan kekuatan penuh database relasional+ SQL. Buat Anda para
programmer pemula yang memang masih awam dengan Mysql dan konsep
database pada umumnya, tidak perlu minder atau khawatir. Ketika mulai
belajar Mysql saya hanya mempunyai skill atau mengetahui tentang SQL
hanya Select, Update, Create Table, dan Drop Table. Apa itu join
bagaimana mengubah skema tabel, bagaimanamendesain database yang baik
dan ternormalisasi, semuanya masih blank. Dan semuanya harus dipelajari
sambil jalan, tapi toh akhirnya semua baik-baik saja.
Lewat artikel ini kita kan membahas tentang hal-hal apa yang perlu diketahui agar bisa memakai Mysql dengan efektif dan efisien.
1. Tabel MYSQL Bukanlah Array
Programmer PHP atau perl tentu saja familiar dengan array dan hash,
yang biasnya dipakai untuk menyimpan sekumpulan data terkait. Sebagian
dari mereka yanng 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 parsisten (disimpan di
disk). Cara pandang mereka yang seperti ini tidak sepenuhnya salah,
karena toh dalam record dari tabel biasanya ditampung kedalam array/
hash. Hanya saja biasanya seorang programmer PHP cara pandangnya
berbeda dan melakukakan 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
);
Kode programmer diatas bertujuan mencari jumlah record dalam sebuah
tabel. Si programmer yang terobsesi menganggap tabel Mysql sebagai
sebuah array, mencoba membangun dulu arraynya dan mengisi satu persatu
elemen dari hasul query agar nantinya bisa menggunakan fungsi array
count ( ), selesai dicount ( ) variabel $rows langsung dibuang lagi, ini
adalah cara yang lebih efisien :
Select Count (* ) From t1
Lalu apa yang salah dengan kode SQL kedua, si programmer perl,
dalam hal ini ingin mengambil tia[a record ditabel 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 elemen ke-0 berisi nilai field f0, elemen ke-1 f1,dst.
Masalahanya kemudahan ini mengorbankan nama field yang menjadi sangat tidak deskriptif.
2. Bahasa SqL dan Fungsi Fungsi Mysql
MYSQL adalah database Sql. Sebadai programmer kita harus rajin
mempelajari database MysqL dengan efektif, dan tidak boleh malah
mempelajari bahasa keduanya yaitu SQL. Jika tidak belajar SQL maka ada
kemungkinan anda akan melakukan kesalahan seperti dibawah ini :
$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;
}
}
Salah atau benarkah program diatas???
Programmer diatas hanya ingi mencoba mensimulasikan klausa WHERE Sql
dengan melakukan pengujian kondisi dikode php. Padahal yang seharusnya
dilakukan adalah:
SELECT * FROM bigtable WHERE age >= 40
Ingattttttt......!!!!!!!!!
Tidak semua record harus dikirim dari MYSQL keprogram PHP anda.
|
Sql sudah menyediakan cara untuk menyortir data, menformat tampilan,
mengelompokan dan memfilter record, dsb. Mysql juga terkenal banyak
menyediakan fungsi-fungsi , mulai dari manipulasi tanggal, angka string ,
dsb.
Ini adalah contoh lain Programmer PHP yangmemanfaatkan fasillitasdari 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<br>\n";
}
Padahal Mysql sudah menyadiakan 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]<br>\n";
}
3. Limit, Limit, Limit
Salah satu alasan mengapa MYSQL sangat cocok untuk aplikasi Web
adalah karena mendukung klausa LIMIT. Karena untuk membatasi jumlah
record hasil yang diinginkan dalam satu perintah SQL. Juga didukung oleh
database lain seperti PostgreSQL, Firebird dan funsional LIMIT.
4. Tipe Data
Seorang programmer PHP yang tidak kenal dengan MYSQL kadang- kadang
cenderung memilih jenis data yang salah ( umumnya : memilih VARCHAR ()
padahal ada tipe data yang lebih tepat) dikarenakan tidak mengenal jenis
data yang tersedia.
Berikut ini beberapa contoh kurang tepatnya pemilihan tipe data :
- Memilih Char(8), atau Varchar(10) dan bukanya Date untuk menyimpan
tanggal; kerugianya, lebih boros tempat dan tidak bisa memanfaatkan
fungsi- fungsi khusus tanggal.
- Memili Char(3), atau Char (6) ketimbang Tyinyint Unsigned untuk
menyimpan data boolean (“Yes “ dan “No”; atau “True” dan “False “;
padahal jauh lebih dinyatakan dengan 1 dan 0 yang hanya menempai 1 byte)
- Memilih Float dan Double dan bukanya Decimal untuk menyimpan jumlah
uang; kerugiannya, Float dan Double adalah berbasis biner dan
seringkali tidak eksak dalam menyimpan pecahan Desimal.
5. Normalisasi dan Pemodelan
Normalisasi , skema , entiti-atribut , primary key (PK) dan foreign
key (FK), tabel entiti, tabel relasi, OLTP & OLAP semuanya adalah
istilah- istilah yang umumnya dijumpai dalam pemodelan fisik database.
I. Langkah pertama
- Dalam pemodelan adalah menemukan entiti-entiti. Enetiti bisa
dibilang “objek” yang akan kita geluti. Misalnya, costumer, produk, dan
transaksi. Seriap entiti biasanya ditaruh dalam satu tabel, tabel ini
disebut tabel entiti.
- Mencari atribut-atribut entiti tersebut. Misalnya tabel costumer
memiliki atribut sapaan , nama, alamat( jalan, kota , kodepos,
propinsi,& negara), tanggal record ini ditambahkan, dsb.
- Mencari relasi diantara entiti-entiti. Umumnya relasi adalah satu
dari 1-1, 1- many, many-many. Misalnya, relasi antara transaksi dan
produk adalah many-many, artinya sebuahnya transaksi pembelian dapat
berisi produk dan sebuah produk tentu saja dapat dibeli dalam lebih dari
satu transaksi. Setiap relasi juga ditepkan pada tabel yaitu tabel
relasi.
II. Langkah kedua
- Dalam permodelan tidak ada yang benar dan salah . yang ada adalah
model yang tepat dan tidak tepat untuk keperluan tertentu. Misalnya
untuk aplikasi sederhana modelnya sederhana. Semakin komplek aplikasi,
model pun semakin rumit (jumlah entiti, relasi, dan atribut akan
bertambah ).
- Tabel customet memiliki atribut alamat. Jika kita ingin mendukung
banyak alamat untuk satu customers,maka alamat akan menjadi entiti dan
menempati tabel sendiri. Lalu kita membuat tabel relasi customers
alamat.
6. Indeks
Indeks adalah sesuatu yang berkaitan erat dengan implementasi, bukan modeling.
Tapi intinya indeks adalah setiap kolom yang:
- Memiliki rentang nilai cukup banyak
- Terletak pada tebl yang berisi banyak record;
- c. Sering kali disebutkan diklausa Where dan /atau Order By dan/atau Group By; perlu diberi indeks. Ini dikarenakan indeks membantu mencari secara cepat sebuah nilai dari banyak nilai yang ada.
Beberapa contonhya:
- Setiap primary key umumnya otomatis diberi oleh database server,
meskipun tabelnya masih berisi sedikit record atau bahkan kosong.
Dikarenakan database harus sealalu mengecek keberadaan sebuah nilai
field manakala ada sebuah record yang ditambahkan ( ingat, PK artinya tak boleh ada dua record yang mengandung nilai field ini yang sama). Tampa indexing, pengecekan akan memakan waktu yang lama.
- Field tanggal lahir dalam tabel customers kemungkinan besar harus
diindeks. Bahkan dayofyear()field ini juga mungkin perlu diindeks.
Mengapa? Karena 1. Rentang nilai cukup besar (365 hari dalam setahun * +
- 60 jumlah tahun) 2. Tabel customer potensial ukuranya besar. 3.
Sering disebutkan di klausa Where (misalnya mencari customers yang ultah
hari ini).
- Field jenis kelamin mungkin tidak perlu diindeks, kecualai
perbandingan pri:wanita amat drastis bedanya. Mengapa? Sebab 1. Rentang
nilai yang ada hanyalah dua:L ( Lelaki) dan P (Perempuan). Meskipun ada
indeks tetap tidak mempengaruhi kenerja.
7. Konkurensi, Locking, dan Transaksi
Programmer kadang tidak menyadari bahwa program/ skrip yang
dinuatnya tidaklah seperti program dekstop yang dijalankan oleh satu
user. Melaikan, dalam satu waktu bisa saja ada 10 atau 100 user yang
“menembak” skrip anda diWeb. Kerena itu, isu locking dan konkurensi
penting sekali. Contohnya :
$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'");
Untuk kasus diatas pemecahannya adalah
// 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 ini kadang-kadang harus melakukan locking terhadap
tabel record untuk menjamin bahwa selama ini kita // do something else…
Klien 2, klien3, dan klien4 tidak bisa seenaknya menaikkan 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 karena kita tidak [erlu 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 didunia database, hampir tidak pernah kita jumpai dibahasa
pemrograman ( karena data bahasa pemrograman ditaruh dalam variabel
dimemori semua; tidak ada isu disk yang crash /lambat/ rusak / harus
disinkronkan dengan data dimemori ). Karena itu anda perlu memahami
konsep ini dari buku-buku tentang database.
8. Jenis Tabel
Di Mysql dikenal istilah tabel handler dan jenis tabel. Sekarang ada 3
jenis tabnel yang bisa dipakai di Mysql: MyiSam (default), BekeleyDB,
dan InnoDB.
Yang perlu diketahui ada 3 hal yaitu:
- a. Tidak semua tabel mendukung transaksi ( MyISAM tidak
mendukung transaksi, jadi COMMIT dan RoolBack tidak melakukan sesuatu
yang semestinya jika anda menerapkkan pada tabel MyIsAM)
- b. Tidak semua tabel punya karakteristik performace 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 tabelspace;
- c. Distribusi Mysql yang bukan – Max tidak kompile dengan dukungan terhadap BerkeleyDB dan InnoDB.
Nomer 3 atau C perlu anda ketahui karena jika kita ingin mengitruksikan Mysql untuk database dengan jenis tertentu :
CREATE TABLE (...) TYPE=BDB;
Dan Mysql tidak kompilr untuk mendukung BerkeleyDB, maka Mysql tidak
akan protes dengan error, melainkan membuatkan tabel yang tersebut untuk
kita tapi dengan tipe default yaitu MyIsAm. Jadi anda perlu mengecek
dulu dengan 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 | ...
+------+--------+-...
Ternyata MyISAM!