MongoDB คืออะไร MongoDB ทำหน้าที่อะไร

MongoDB คืออะไร MongoDB ทำหน้าที่อะไร

ผมเชื่อว่า คนที่อ่านหน้านี้ น่าจะรู้จัก MySQL เป็นอย่างดี หรืออย่างน้อยก็รู้จัก หรือเคยได้ยินชื่อ Oracle บ้างมาแล้วแน่นอน ซึ่งถ้าให้พูดมุมกว้างๆ ทั้ง MySQL และ Oracle ต่างก็เป็น database ที่เอาไว้เก็บข้อมูลทั้งคู่ครับ แต่ว่า รู้หรือเปล่าครับ ว่า database ที่ทำหน้าที่เก็บข้อมูลนั้น บนโลกเรายังมีอีกมากมาย หลายยี่ห้อ และผมเชื่อเหลือเกินว่าหลายตัวท่านไม่เคยได้ยินมาก่อน บางตัวมันอยู่ใกล้เรามากเลย แต่เราก็แทบไม่รู้จักมันเลยด้วยซ้ำ เช่น SQLite ที่เวลาคนที่ติดตั้ง พวก web server สำเร็จรูป เช่น Appserv, Xampp, Wampp, Lampp มักจะได้ SQLite มาด้วย หรือ Open source หลายตัวก็สามารถใช้งานได้บน SQLite ด้วยเช่นกัน แต่ว่าเราจะไม่กล่าวถึงอะไรเหล่านั้น เพราะว่าเราจะพูดกันในเรื่อง MongoDB เท่านั้นครับ

Database แบบ SQL

ก่อนจะรู้จัก MongoDB ขอเล่าเรื่องที่เป็นพื้นฐานก่อนละกัน ต้องท้าวความกลับไปที่เรื่องของ database แบบ SQL กันก่อน สำหรับหลายคนที่ยังไม่เคยเรียนเรื่อง database หรือว่าเรียนแล้วลืมแล้วก็ตาม (แถมคนที่คืนอาจารย์ไปหมดแล้วด้วยเอ้า!) เจ้า SQL ก็คือภาษายอดนิยมที่เค้าใช้เขียนเพื่อทำงานกับ database ในทุกแง่มุม ไม่ว่าจะเป็นการ เขียน/อ่าน/แก้ไข ทั้งข้อมูล และโครงสร้าง ของ database เลย ให้มองว่า database มันคือ มนุษย์ต่างดาวที่มาจากดาวเสาร์(ดวงมันใหญ่ดี 5555) ซึ่งเราเป็นชาวโลก เราต้องการจะสื่อสารกับ มนุษย์ดาวเสาร์ เราก็เลย ต้องใช้ภาษากลาง ที่ทั้งเรา และดาวเสาร์ต่างก็เข้าใจกัน ในที่นี้ก็คือ ภาษา SQL นั่นแปลว่า ถ้าเราไม่มี ภาษา SQL เราก็คุยกับมนุษย์ดาวเสาร์ไม่รู้เรื่อง (ไม่นับคนที่มีวุ้นแปลภาษาของโดเรมอนแล้วกันนะ) ดังนั้นเราก็จะเอาข้อมูลไปฝากไว้ที่เค้าไม่ได้ เปรียบความจริงก็คือเราก็ใช้งาน database เพื่อเก็บข้อมูลไม่ได้ แต่ด้วยความที่ว่ามันเป็นภาษากลาง ทำให้เราสามารถคุยกับมนุษย์ดาวเสาร์ที่มาจากส่วนไหนของดาวก็ได้ ไม่ว่าจะเป็นขั้วเหนือของดาวไปจนถึงด้านใต้เลย แต่กลับกันหากเราใช้ภาษาไทย เราก็คุยได้แค่กับคนไทยเท่านั้น เราคุยกับคนบราซิลหรือคนทั้งโลกไม่รู้เรื่องแน่ๆ ดังนั้น ด้วยความที่ SQL เป็นภาษากลาง มันจึงมี database มากมายที่ใช้ SQL ในการทำงาน และรวมไปถึง structure ก็ออกมาคล้ายกันหมด แต่ความต่างของ database แต่ละชนิด ก็คือ Feature ต่างๆ อาธิเช่น Oracle มีระบบ จัดการ Transaction ที่ดีเยี่ยม แปลว่า transaction จะไม่มีทางตกหล่นหายไประหว่างการทำงานหรือเกิดปัญหาใดแน่นอน ในขณะที่ SQLite มีจุดเด่นก็คือทำงานได้รวดเร็วกว่า MySQL นั่นเอง

อีกเรื่องหนึ่งที่เป็นเรื่องเด่นๆของ database แบบ SQL ก็คือการทำงานแบบที่มีความสัมพันธ์กัน เช่น เราสร้างตารางนึงมาเก็บประวัติส่วนตัวของสมาชิก และสร้างอีกตารางมาเก็บข้อมูลการหาหมอ ซึ่งแน่นอนว่า 1 คนหาหมอได้หลายครั้ง แต่เราจะไม่เอาข้อมูลทั้งหมดของคนคนนั้นไปใส่ในตารางเก็บข้อมูลการหาหมอ แต่เราจะใช้การอ้างอิงเอา เช่น การหาหมอครั้งที่ 1 เป็นประวัติของนาย ก (ซึ่งมี id คือ 1) และครั้งที่สอง เป็น นาย ข (ซึ่งมี id คือ 1) และครั้งที่สามก็อาจจะเป็น นาย ก อีกครั้ง (id ของ นาย ก ก็คือ 1 เหมือนเดิม) ทำให้ลดข้อมูลซ้ำๆ และด้วยความสัมพันธ์ที่อิงกันนี้ ทำให้เราสามารถเรียกข้อมูลการหาหมอของนาย ก ออกมาได้ด้วยการทำงานเพียงครั้งเดียวเท่านั้นเอง

ทำความรู้จัก No SQL

ถึงตรงนี้ยังไม่ถึงเวลาที่จะรู้จักกับ MongoDB ขอเล่าเพิ่มอีกนิด เพราะว่ามันเกี่ยวข้องกันกับ MongoDB โดยตรง ก็คือ database แบบ NoSQL เป็น database แบบใหม่ ที่เกิดขึ้นได้ไม่นานมานี้ จากประวัติแล้ว เกิดขึ้นในปี 2541 นี่เอง  โดยนาย Carlo Strozzi ได้ให้คำนิยามเอาไว้ในปีนั้น แต่ว่า ในครั้งแรก เค้าบอกแค่ว่า เป็นระบบ database ที่ทำงานโดยมีความสัมพันธ์กัน(relational) แต่ว่าทำงานได้เบากว่ามาก และไม่ได้ใช้ภาษา SQL ในการทำงาน ซึ่งเป้าหมายหลักของ NoSQL ไม่ได้อยู่ที่การไม่ใช้ภาษา SQL ในการทำงานเท่านั้น แต่เป็นการลดความยุ่งยาก ซับซ้อนในระบบ database เพื่อให้สามารถทำงานได้อย่างรวดเร็วขึ้น และเพิ่มระบบป้องกันความผิดพลาด ในการทำงานขึ้น แต่ว่าข้อเสียก็คือ ข้อมูลจะเกิด loss ได้มากขึ้นด้วย (เพราะว่าไม่เน้นความถูกต้องของข้อมูลมาก แต่เน้นให้ทำงานเร็ว เพื่อประสิทธิภาพในการทำงานมากกว่า) โดยความเร็วที่ได้รับ เพิ่มขึ้นมาก ในหลายๆ database ของ NoSQL เราจะไม่พบว่ามี database แบบ SQL แบบใด ที่สามารถทำงานเทียบเท่ากันได้เลย (หรือทำงานเทียบเท่าได้ ก็จะด้อยกว่าในด้านอื่นๆ ที่ NoSQL มี) และแน่นอนว่า database แบบ NoSQL นี่ก็ไม่ได้ใช้ภาษากลางที่เป็น SQL เพื่อคุยกับ database แล้ว แต่กลับใช้ภาษาของ NoSQL แต่ละเจ้าเอง แต่ว่าด้วยความที่ NoSQL ไม่ซับซ้อนเท่า database แบบ SQL ทำให้การเรียนรู้ในการใช้ database แบบ NoSQL ไม่ยาก เพราะว่าส่วนใหญ่จะเน้นไปในทาง เอาค่าที่เป็นคีย์ (เช่น user id) เข้าไปค้นหาเอา Value ออกมา(เช่น ข้อมูลของ user) แค่นั้นเอง

MongoDB คืออะไร

ก็เป็น database แบบ NoSQL ตัวหนึ่ง ซึ่งแน่นอนว่า ไม่เหมือนกับ MySQL แน่ๆ แต่สิ่งที่ MongoDB หยิบยื่นให้แตกต่างจาก NoSQL ตัวอื่นบางตัว ก็คือการที่มีบริษัท เอกชนเป็น back หลังให้อยู่ ซึ่งคือบริษัท 10gen Inc (หลายตัวก็มีบริษัทสนับสนุนด้วยเหมือนกัน) เนื่องมาจาก product อะไรก็ตามที่เป็น Open Source แบบคนธรรมดาทำ จะมีความเสี่ยงอย่างหนึ่งก็คือ ใช้ๆไปแล้ว เกิดคนที่พัฒนาเบื่อ หรือเปลี่ยนความสนใจ หรือมีเหตุที่จะไม่สามารถทำต่อได้อีก อนาคตเราก็ดับวูบไปเลย แต่ว่าหากมีบริษัทเป็น Backup อย่างน้อยก็มั่นใจได้ว่ามันจะยังไปต่อได้ ตราบใดที่มีบริษัทสนับสนุน และเมื่อถึงวันที่มันแข็งแกร่งพอก็จะเกิด version community ตามออกมาเอง คราวนี้ก็จะเหมือนดาวค้างฟ้า เป็น Open Source คงกระพันเหมือนอย่างที่ MySQL เคยเป็นมาก่อนนั่นแหล่ะ

อีกเรื่องที่เป็นความแตกต่างก็คือ MongoDB ไม่ได้เรียบง่ายมาก ถึงขนาดกับเป็น database ที่เก็บได้แค่ key กับ value ที่ทำเงื่อนไขอะไรอย่างอื่นไม่ได้ แต่ว่ามันสามารถทำงานที่มีความซับซ้อน และเงื่อนใขเพิ่มขึ้นได้มากกว่า database ตัวอื่น โดยตัว MongoDB เอง ชูจุดเด่นเอาไว้ดังนี้

 

  • เก็บข้อมูลแบบ Document - คือการเก็บข้อมูลในรูปแบบที่เป็น Pattern แบบมีโครงสร้าง (จะไม่แบนๆ แบบ MySQL ที่ใน table จะมี field หลายๆ field) โดยมีโครงสร้างแบบทั้งลึกและกว้าง ในแต่ละ record หากนึกไม่ออก ลองนึกถึง array แบบหลายมิติครับ นั่นล่ะครับ 1 record สามารถเก็บเป็นแบบ array หลายมิติได้ ไม่แบนราบเหมือน MySQL 1 record ที่เมื่อแปลงเป็น Array ก็ได้แค่มิติเดียวเท่านั้น
  • รองรับการทำ Full Index - มีข้อดีในการ search หาได้อย่างรวดเร็วกับข้อมูลที่มีปริมาณมหาศาล(เรียกว่ามหาศาล เพราะ เยอะกว่าปกติ) และ search ได้จาก ข้อมูลใน ส่วนใดก็ได้
  • รองรับ การขยายขนาด และ รองรับการทำงานหนักๆ - เพราะว่าเน้นรองรับงานหนัก และ ปริมาณข้อมูลมากๆ สามารถขยายขนาดได้อย่าวรวดเร็ว ลดข้อจำกัดต่างๆลง
  • ทำระบบสำรองได้ง่าย - เราสามารถเพิ่ระบบเพื่อทำงานเป็นตัวหลัก ตัวรอง หรือว่า เป็นหลายๆตัวช่วยกันทำงาน ได้อย่างง่ายๆ ไม่ต้องตั้งค่าอะไรเยอะแยะ
  • การเรียกข้อมูลมากแสดง - อย่างที่บอกว่า เป็นการเก็บข้อมูลแบบโครงสร้าง ดังนั้นเวลาเรียกข้อมูลมาแสดงก็จะได้ทั้งโครงสร้างของข้อมูลออกมาเลย
  • แก้ไขข้อมูลได้รวดเร็ว - หากเราใช้ MySQL แล้วศึกษาลึกๆ จะพบว่าการ query update จะทำให้ตารางนั้น lock จังหวะที่ update แต่ว่า MongoDB ไม่เป็นอย่างนั้น
  • เขียนชุดคำสั่งการทำงานได้ - หากเรามีการทำงานหลายขั้นตอน แบบซ้ำๆ เมื่อเกิดการทำงานในลักษณะแบบใด เราก็จัดกลุ่มคำสั่งที่ทำซ้ำๆแล้วเขียนเหมือนเป็น script เอาไว้เลย เวลานันก็รันทั้งก้อนนี้เลย
  • เก็บข้อมูลด้วยระบบ GridFS - เป็นระบบการเก็บไฟล์บนพื้นที่ Harddisk ที่เก็บข้อมูลเป็นก้อนๆ และรองรับการเพิ่มหรือลดของปริมาณข้อมูลได้
  • มีบริการสอบถามและดูแลเป็นพิเศษ - มี service ดูแลอย่างดีเป็นพิเศษ ให้คำปรึกษาพร้อมดูแลอย่างใกล้ชิด โดยบริษัท 10gen, Inc แต่ก็แน่นอนว่าไม่ฟรีนะสำหรับการบริการพิเศษแบบนี้

และอีกเรื่องที่ทำให้มันน่าสนใจ ก็คือ Performance ถึงแม้ว่าจะช้ากว่า NoSQL ด้วยกันเอง แต่มันก็เร็วกว่า MySQL มากๆ และข้อมูลที่เก็บก็มีความน่าเชื่อถือ ไม่สูญหายดีในระดับหนึ่ง เพราะว่า NoSQL หลายตัวที่ชูเรื่องความแรงมากๆ แต่ถ้าเครื่องดับโดยไม่คาดฝันข้อมูลสูญหาย หรือเสียหายไปเลยก็มี

ใครใช้ MongoDB

อาจจะยังไม่แพร่หลายเท่าไร เท่าที่เอาไปใช้งานกันจริงตอนนี้ ก็มี FourSquare, Source Forge, Bit.ly, Shutterfly, MTV network, IGN Entertainment และอีกหลาย product ในโลกใบนี้ ดูหน้านี้เอาละกัน เยอะอยู่ (เค้าคัดเฉพาะ brand ที่มีชื่อเสียง) อย่าง case ของ source forge นี่เค้าบอกเลย และเนื่องจากเว็บมีคนเข้าเยอะมาก ทำให้ database เดิมที่ใช้อยู่ทำงานไม่ทัน เว็บก็โหลดช้ามาก บางคนก็เปิดได้บ้างไม่ได้บ้าง เค้าก็เลยเริ่มใช้ MongoDB และเริ่มทำการ scale ขยายขนาดเพิ่มขึ้นเพื่อรองรับการใช้งานมากๆ ทำให้ปัจจุบัน ก็ยังใช้งานได้ดีอยู่ไม่มีปัญหา และรองรับคนเปิดเว็บได้จากทั่วโลกอย่างไม่มีปัญหาอะไร

แต่ถ้าในมุมของ NoSQL เอง ที่ไม่เจาะจงว่าต้องเป็น MongoDB นั้น มีหลาย brand ทั่วโลกใช้งานอยู่มานานแล้ว ไม่ว่าจะเป็น Google, Amazon, Facebook, Yahoo และอื่นๆ เรียกได้ว่า ตัวเบ้งๆใน online เค้าก็ใช้กันทั้งนั้นแหล่ะ จะให้ใช้ database แบบ SQL ปกติ ก็ไม่ทันกินอย่างแน่นอน

MongoDB เทียบ MySQL

ไม่เทียบก็ไม่ได้นะครับ จะได้รู้ว่า ดีไม่ดีต่างกันอย่างไร หัวข้อนี้ผมจะเอาผลการทดสอบจากหลายที่มาลงแทนแล้วกันนะครับ เพราะมีคนเทสเอาไว้แล้ว แต่ผมจะเล่าให้ฟังเบื้องต้นว่าเค้าเทสอย่างไร และผลออกมาเป็นอย่างไรโดยสรุป 

ทดสอบ เปรียบเทียบ MySQL กับ MongoDB จาก http://www.scalabiliti.com/blog/mongodb_vs_mysql

ทดสอบ สามรูปแบบ คือ

  1. insert 10K record - ผลการทดสอบ MySQL ใช้เวลา 16,327 ms, MongoDB ใช้เวลา 1,912 ms
  2. update 1K record โดยไม่มี key กำกับ  - ผลการทดสอบ MySQL ใช้เวลา 31,151 ms, MongoDB ใช้เวลา 6,484 ms
  3. update 1K record โดยมี key กำกับ  - ผลการทดสอบ MySQL ใช้เวลา 1,592 ms, MongoDB ใช้เวลา 1,097 ms

ทดสอบ เปรียบเทียบ MySQL กับ MongoDB จาก http://obvioushints.blogspot.com/2009/07/benchmarking-mongodb-vs-mysql.html

ทดสอบด้วยการใช้ concurrent คือการทำงานเข้ามาพร้อมกันเลย เหมือนกับการเปิดเว็บพร้อมกันเป็นร้อยๆคนนั่นแหล่ะครับ โดยตัวอย่างนี้ เค้าสั่ง load url จาก text file เข้าไป เพื่อไล่เปิดตามนั้น พร้อมๆกัน 300 concurrent user และจะมีหน่วงเวลาตามการ random 0-1 วินาทีด้วย

ผลการทดสอบ ส่วนของ MongoDB ทดสอบไปเปิดไป 2994 ครั้ง ใช้เวลาทั้งหมด 11.95 secs , fail 6 คิดเป็น 250.54 transaction / secs , ส่วนของ MySQL ทดสอบไปเปิดไป 2832 ครั้ง ใช้เวลาทั้งหมด 23.53 secs , fail 168 คิดเป็น 120.36 transaction / secs

ทดสอบ เปรียบเทียบ MySQL กับ MongoDB จาก http://labs.laulima.com/mongodb-vs-mysql-performance-benchmarks-cms/

ทดสอบด้วยการเอา CMS มาทดสอบกับ ระบบ database ให้เหมือนการใช้งานบนเว็บทั่วไป โดยเน้นที่ read + update โดยกำหนด 10 read ต่อ 1 update แต่ก็จะรวมไปให้ครบทั้งหมด คือ select - update - insert - delete ด้วย

โดยผลการทดสอบ รูปแบบ 1 visitor พบว่า MongoDB ทำงานช้ากว่า MySQL แต่เมื่อ ทดสอบด้วย Concurrent มากกว่า 1 พบว่า MongoDB สามารถตอบสนองได้ดีกว่ามาก สามารถทำงานเสร็จได้เร็วกว่าประมาณ 2 เท่าของ MySQL

สรุปการทดสอบเปรียบเทียบ MySQL กับ MongoDB

จะเห็นได้ว่าต่างกันในหน่วย ms ก็จริง(หลายผลการทดสอบจะบอกว่าเร็วกว่าประมาณ 2-3 เท่า) แต่ต้องลองคิดถึงงานจริงๆ ถ้าเกิดมีคนใช้งาน 1000 คน คนละ 1000 record จะต่างกันมากขนาดไหน แน่นอนว่า เวลาที่ต่าง เครื่องก็ต้องทำงานหนักต่างกันด้วย ถ้าทำงานเสร็จก่อน เครื่องก็มีเวลาได้พักบ้าง เพื่อให้พร้อมรับงานใหม่ต่อไปได้อีก แต่ความเป็นจริงเครื่องคอมไม่ต้องการเวลาพักหรอกครับ แต่ว่ามันจะเกิดการทำงานหนักสะสม และทบกันไปเรื่อยๆ คืองานเก่ายังไม่เสร็จ งานใหม่ก็เพิ่มมา แล้วเมื่อเยอะถึงจุดหนึ่งระบบก็จะตอบสนองไม่ทัน เหมือนค้างๆไปเลยครับ ดังนั้นถ้าระบบต่างๆทำงานได้เร็ว เครื่องก็จะสามารถรองรับปริมาณงานที่มากขึ้นได้นั่นเอง

สรุป MongoDB

ความน่าสนใจมันอาจจะไม่มีเลย ถ้าเว็บคุณมีคนเข้าแค่วันละไม่กี่ร้อย หรือไม่กี่พันคน และเว็บก็มีแค่เนื้อหานิดหน่อยทำอะไรไม่ได้มาก แต่ว่ามันเป็นตัวเลือกที่น่าสนใจมาก หากเราเอามารองรับปริมาณคนเข้าเว็บเยอะมากๆ หลักหมื่นหรือหลักแสน หรือว่าเอามาทำ web application อะไรที่มีการใช้งานเครื่อง server เป็นจำนวนมาก แบบนี้ล่ะเหมาะมากเลย เพราะว่าการทำเว็บ มันก็เหมือนเป็น ศาสตร์และศิลป์ ทั้งส่วนที่เป็น front end และ back end เพราะว่าหลายคน ทำเว็บก็เลือกใช้ php, mysql ตลอด งานหนักงานเบาก็เลือกใช้แบบนี้ ซึ่งเมื่อเจองานหนักจริง ระบบก็ล่มไปในทันที แล้วก็แก้ปัญหาไม่ได้ เพราะว่ามันเป็นข้อจำกัดของระบบนั้นจริงๆ ทั้งๆที่ hardware แรงก็เอาไม่อยู่เหมือนกัน ดังนั้น เราจำเป็นที่จะต้องเลือกใช้ system ต่างๆให้เหมาะกับงาน ก็เหมือนการเลือกเครื่องประดับให้เหมาะกับเสื้อผ้าหน้าตา และงานที่จะไปนั่นแหล่ะ คนที่ชอบแต่งตัวแบบ ชิลๆ จะแต่งตัว ชิลๆ ไปสมัครงาน ไปงานแต่งงานเพื่อน มันก็ไม่ถูกต้องครับ

แต่ ผมก็ไม่ได้บอกว่า หนัมาใช้กันเถอะ เปลี่ยนเลยวันนี้ ไม่เลยครับ ย้อนกลับไปอ่านอีกทีว่า บอกแล้วให้เลือกให้เหมาะกับงาน เริ่มต้น MySQL ก่อนทำเหมือนอย่างที่เคยทำไม่มีใครว่าหรอกครับ แต่ว่าเมื่อเว็บดังมากระดับหนึ่งคนเข้าเยอะมากต่อวัน จะมานั่งใช้ MySQL แบบติดๆดับๆมันเอาไม่อยู่หรอกครับ เสียลูกค้าเปล่าๆ แต่ก็อีกนั่นแหล่ะ ถ้าเราไม่ลองใช้เมื่อถึงเวลาจะต้องใช้ จะใช้เป็นอย่างไร เราก็ต้องรู้จักลับมีของเราให้คมอยู่เสมอๆ ให้พร้อมเวลาใช้งานจริง 

ไปพร้อมๆกันก็ได้ครับ ผมเองก็แค่เคยทดสอบทำอะไรนิดหน่อย ยังไม่ได้เอามาใช้งานจริง เพราะว่างานระดับนั้นยังไม่เคยทำสักที และปัจจุบันผมก็ใช้การ optimize sql เวลาใช้งาน MySQL เอาเพื่อรีดประสิทธิภาพให้มันสุดๆอยู่เลยยังไม่มีปัญหา แต่บางงานก็เริ่มสังเกตุเห็นว่า สงสัยใกล้ได้เวลาเปลี่ยนแล้ว 555

Create: Modify : 2012-04-22 11:02:08 Read : 30763 URL :