Sabtu, 03 Mei 2014

Bahasa Indonesia 2 : Tulisan 5

Artikel Tentang Mysql

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 :
  1. Memilih Char(8), atau Varchar(10) dan bukanya Date untuk menyimpan tanggal; kerugianya, lebih boros tempat dan tidak bisa memanfaatkan fungsi- fungsi khusus tanggal.
  2. 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)
  3. 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:
  1. Memiliki rentang nilai cukup banyak
  2. Terletak pada tebl yang berisi banyak record;
  3. 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:
  1. 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)
  2. 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;
  3. 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!

Tidak ada komentar:

Posting Komentar