July 15, 2012

MyISAM vs MEMORY

ในบทความนี้เราจะมาเปรียบเทียบ Storage Engine ของ MySQL กัน ระหว่าง MyISAM กับ Memory ว่าแตกต่างกันอย่างไร มีข้อดีหรือข้อเสียอะไรบ้าง
ก่อนอื่นเลย หลายคนคงสงสัยว่าแล้วไอเจ้า Storage Engine มันคืออะไร, MyISAM ล่ะ มันคืออะไร แล้ว Memory มันคืออะไร? ผู้เขียนจะขอเกริ่นคร่าวๆก่อน

Storage Engine คือ ชนิดของฐานข้อมูลที่เราใช้ในการจัดการและจัดเก็บข้อมูลลงในหน่วยความจำหรือดิสก์ มีอยู่หลายประเภทให้เลือกใช้สำหรับ MySQL โดยแต่ละประเภทก็มีคุณสมบัติในการใช้งานที่แตกต่างกันออกไปด้วย



MyISAM คือ Storage Engine ชนิดหนึ่ง ซึ่งเป็น Storage Engine มาตรฐาน (Default) ของ MySQL ถ้าไม่มีการใช้คำสั่งพิเศษเพิ่มเติมอะไร เจ้า MySQL ก็จะใช้ Engine ตัวนี้ในการจัดการกับฐานข้อมูลตลอด คุณสมบัติหลักๆคือ จัดเก็บข้อมูลลงดิสก์, ไม่สนับสุนการทำงานแบบ Transaction, มีประสิทธิภาพสูงและใช้งานอย่างแพร่หลาย แต่อาจมีข้อมูลขยะอยู่มาก จึงต้องหมั่นทำการ Optimize ฐานข้อมูลอยู่บ่อยๆ ส่วนปัญหาอื่นๆก็มีมากเหมือนกัน เมื่อเทียบกับ InnoDB หรือ Engine ตัวอื่นๆ

MEMORY ก็คือ Storage Engine อีกชนิดหนึ่ง แต่แตกต่างกับ MyISAM อย่างเห็นได้ชัด ตรงที่ว่าเจ้า Engine ตัวนี้จะเก็บข้อมูลลงในหน่วยความจำหรือ RAM นั่นเอง ทำให้มีความเร็วในการอ่านและเขียนข้อมูลสูงมาก แต่ก็ทำให้เกิดข้อเสียหลักๆเลยคือ เมื่อปิดเครื่อง, เกิดไฟดับหรือเมื่อไม่มีไฟเลี้ยงแรม ข้อมูลทุกอย่างที่อยู่ในตารางจะหายหมด เหลือแต่เพียงโครงสร้างตารางหรือ Schema เท่านั้น ซึ่งถ้าเป็น MyISAM จะเก็บข้อมูลลงดิสก์ เมื่อไฟดับหรือปิดเครื่องเปิดขึ้นมาใหม่ ข้อมูลก็ยังอยู่ครบ
คราวนี้ผู้เขียนจะลองมาทดสอบความเร็วของเจ้า MEMORY Engine ดู ว่ามีประสิทธิภาพในเรื่องของความเร็วมากกว่า MyISAM ขนาดไหน

1. อย่างแรกก็ต้องสร้างตารางขึ้นมาก่อน โดยตารางทั้งสองนี้ใช้ Engine ที่แตกต่างกัน

MyISAM

mysql > CREATE TABLE MyISAM_DB (row INT(10), data VARCHAR(1));














MEMORY

mysql > CREATE TABLE MEMORY_DB (row INT(10), data VARCHAR(1)) ENGINE = MEMORY;










2. ต่อมาก็เขียนโค้ด PHP เพื่อใส่ข้อมูลตัวอย่างจำนวนมากลงในฐานข้อมูล MEMORY_DB โดยการสร้างไฟล์ create_data.php ขึ้นมาแล้วพิมพ์โค้ดดังนี้

<?php
$username = 'peezg';
$password = 'test_engine';
mysql_connect('localhost',$username,$password);
mysql_select_db('Test_Engine');
$i = 0;
while($i <= 1000000)
{
$chr = chr($i%26 + 65);
mysql_query("INSERT INTO MEMORY_DB values ('$i', '$chr')");
$i = $i + 1;
}
echo "finished\n";
mysql_close();
?>

เมื่อพิมพ์เสร็จแล้วก็สั่งรันโค้ดนี้ (อาจใช้ Command Line หรือ Web Browser ก็ได้)

3. ตรวจสอบว่ามีข้อมูลอยู่ในตาราง MEMORY_DB จริงหรือไม่ 














จากนั้นก็คัดลอกข้อมูลทั้งหมดใส่ลงในตาราง MyISAM_DB












4. คราวนี้ลองมาทดสอบ Query กันว่า แต่ละตารางจะให้ผลลัพธ์เร็วขนาดไหน

TEST1 :
mysql> SELECT count(*) FROM MEMORY_DB WHERE row >= 55500 AND row <= 55600;
+----------+
| count(*) |
+----------+
|        101 |
+----------+
1 row in set (0.34 sec)

mysql> SELECT count(*) FROM MyISAM_DB WHERE row >= 55500 AND row <= 55600;
+----------+
| count(*) |
+----------+
|        101 |
+----------+
1 row in set (0.59 sec)

จากผลลัพธ์ MEMORY เร็วกว่า MyISAM เป็น 1.735 เท่า

TEST2 : 
mysql> SELECT count(*) FROM MEMORY_DB WHERE row >= 23350 AND row <= 23400 AND (data = 'A' OR data = 'M');
+----------+
| count(*) |
+----------+
|            4 |
+----------+
1 row in set (0.34 sec)

mysql> SELECT count(*) FROM MyISAM_DB WHERE row >= 23350 AND row <= 23400 AND (data = 'A' OR data = 'M');
+----------+
| count(*) |
+----------+
|            4 |
+----------+
1 row in set (0.60 sec)

จากผลลัพธ์ MEMORY เร็วกว่า MyISAM เป็น 1.764 เท่า

TEST3 :

mysql> SELECT count(*) FROM MEMORY_DB WHERE data = 'Q' OR data = 'X';
+----------+
| count(*) |
+----------+
|    76922 |
+----------+
1 row in set (0.38 sec)

mysql> SELECT count(*) FROM MyISAM_DB WHERE data = 'Q' OR data = 'X';
+----------+
| count(*) |
+----------+
|    76922 |
+----------+
1 row in set (0.69 sec)

จากผลลัพธ์ MEMORY เร็วกว่า MyISAM เป็น 1.816 เท่า

"สรุปผลการทดลอง"
จากผลการทดลองทั้ง 3 ครั้ง (โดยทดลองจากสภาพแวดล้อมข้างต้น - 1 ล้าน Records) จะได้ค่าเฉลี่ยที่ MEMORY Engine มีความเร็วในการ Query มากกว่า MyISAM เป็น 1.772 เท่า
ดังนั้น MEMORY จึงเป็น Engine ที่เหมาะกับการใช้ประโยชน์ในด้านความเร็ว มากกว่าความคงอยู่(ถาวร)ของข้อมูล เพราะมีความเร็วในการ Query สูงมาก เนื่องจากข้อมูลถูกเก็บอยู่ใน RAM และด้วยเหตุผลนี้เอง จึงทำให้ข้อมูลสูญเสียได้เมื่อมีการปิดเครื่องหรือไฟดับ (หากต้องการเก็บข้อมูลเหล่านั้นเอาไว้ ควรมีการทำ back up ลง Disk ควบคู่กันไปด้วย)