ทำไมถึงต้องใช้ MongoDB แทน MySQL? by

29
Nov
6

MongoDB คือ NoSQL ชนิดหนึ่ง ก่อนอื่นบทความนี้บอกก่อนว่าเราจะไม่บอกว่าใช้ MongoDB แทน MySQL ไปเลยได้ 100% เพราะอย่างไรก็ตาม NoSQL ก็ยังคงมีข้อจำกัดความสามารถบางอย่างที่ไม่สามารถใช้แทน MySQL ได้ หรือทำได้แต่จะยากกว่าการใช้ MySQL มากเราต้อง Choose the right tools at the right job ครับ และสำหรับใครที่ยังไม่ได้คลุกคลีกับ MySQL จนกระทั่งเจอปัญหาว่ามันช้าจนรับไม่ได้แล้วละก็ คุณไม่จำเป็นต้องเปลี่ยนมาใช้ MongoDB เลยแม้แต่น้อยครับ ใช้ MySQL ไปเถอะครับ

จุดเด่นของ NoSQL ส่วนใหญ่ (แต่ไม่ใช่ทุกอย่าง) คือความสามารถในการ write ข้อมูลได้เร็วกว่า MySQL เป็นอย่างมาก หากงานที่เราทำนั้นเน้นการ write ข้อมูลมากๆ เช่นต้องเก็บ Log แบบตลอดเวลาแบบ Real-time ทุกการกระทำ และข้อมูลมีขนาดใหญ่โตมาก การใช้งาน MongoDB ก็จะตอบโจทย์ได้เป็นอย่างดี

MongoDB เป็น database แบบ Document-Oriented โดยลักษณะข้อมูลที่ทำการเก็บจะคล้ายกับ JSON เป็นอย่างมาก มีข้อดีอย่างมากคือ Row แต่ละ Row ไม่จำเป็นต้องมีโครงสร้างข้อมูลเหมือนกัน เช่น คุณอาจจะมีข้อมูลปากกา 1 row ที่ระบุแค่สีแดง และอีก row เป็นข้อมูลปากกาที่ระบุว่าสีน้ำเงิน และอีก field ระบุว่าเป็นปากกาชนิดมีด้ามเสียบ ซึ่งมีข้อมูลมากกว่า 1 อย่าง ก็สามารถเก็บได้โดยไม่ต้องเปลี่ยน schema หากใครใช้ MySQL ทำงานกับข้อมูลมากๆ จะรู้ว่าการสั่ง ALTER TABLE เพื่อเปลี่ยนโครงสร้างตารางข้อมูลนั้นช้าเพียงใด (table โดน lock อีกตะหาก) และถ้า requrement จำเป็นต้องเพิ่ม field เข้าไปเรื่อยๆ แล้วละก็เรื่องใหญ่ทีเดียว

บางคนอาจเคยได้ยินว่า MongoDB จะกิน Memory ของเครื่องไปเรื่อยๆ จนกระทั่งหมด เรื่องนี้ไม่เป็นความจริง เพราะ Memory ใน MongoDB ที่มีการใช้งานนั้นจะมีการใช้งานเยอะขึ้นเรื่อยๆ จริง ถ้าดูจาก top แต่ถ้าดูจาก free -m จะทราบว่าจริงๆ Memory ที่ยังใช้งานได้ยังเหลืออีกเยอะ หากมี Process อื่นเกิดต้องการใช้ memory จำนวนมาก ตัว MongoDB จะ Memory ที่ใช้ให้โดยอัตโนมัติ เป็นเพราะ MongoDB ใช้ระบบเดียวกับ cached memory ใน linux ซึ่งจะปล่อยให้ OS เป็นคนจัดการ Memory ให้เลยหลอกตาเหมือนว่าจะกิน Memory เยอะ คล้ายกับเราเปิด top ขึ้นมาครั้งแรกแล้วเห็น free เหลืออยู่นิดเดียว แต่ memory ส่วน cached จะยังมีเหลืออยู่อีกมาก สำหรับรายละเอียดอ่านเหตุผลได้ที่เว็บนี้

ผมขอสรุปข้อดี-ข้อเสียของ MongoDB เป็นข้อๆ ดีกว่าครับ

ข้อดี

  1. write to disk เร็วส์มากกกกก
  2. ถ้าเน้นเอามา write อย่างเดียว ไม่มีการ read (เช่นเก็บ Log ไว้ให้ admin ดู) จะกินแรมน้อยมากกกกก CPU ก็กินน้อยสุดๆ เทียบกับ InnoDB ของ MySQL แล้วต่างกันราวฟ้ากับเหว
  3. write แบบ asynchronous (คล้าย INSERT DELAYED ของ MyISAM ใน MySQL)  คือไม่ต้องรอ Insert เสร็จจริงก็ทำงานต่อได้
  4. read อย่างเดียวก็เร็วกว่า MySQL มากเช่นกัน (ภายใต้ข้อจำกัดว่าข้อมูลของฐานข้อมูลที่เรียกใช้บ่อยๆ ต้องใส่ใน memory ที่เหลือได้พอดี)
  5. มี Capped Collection ซึ่งจะทยอยลบข้อมูลเก่าที่เก็บไว้นานเกินไปแล้วเอาข้อมูลใหม่มาใส่แทนได้ เหมาะแก่การนำมาทำ Log มากเพราะจะ clear ข้อมูลที่เก็บมานานเกินไปไว้ให้อัตโนมัติ ข้อมูลไม่โตกว่าที่เรากำหนด ไม่ต้องมาสั่ง cron ให้คอยลบข้อมุล log ทุกๆ กี่วัน
  6. Scaling เพิ่มเครื่องได้ง่ายกว่า MySQL มากๆๆๆๆ

ข้อเสีย

  1. ถ้า project เก่าคุณมีการ JOIN กันซับซ้อนละก็ จะเปลี่ยนมาใช้ได้ยากมากทีเดียว
  2. การใช้งานผ่านเว็บไม่ง่ายเท่า phpmyadmin เช่นการ query เรื่องวันที่ผ่านเว็บจะลำบากพอสมควร ต้องเขียนหน้า admin ใช้งานเอง และการค้นหาข้อมูลทั่วๆ ไปก็ยากเช่นกัน
  3. กินพื้นที่การเก็บข้อมูลมากกว่า MySQL พอสมควร เหตุผลเพราะไม่มี schema ดังนั้น schema จริงๆ มันจะแอบอยู่ในทุก row ของฐานข้อมูล ทำให้ข้อมูลใหญ่กว่า MySQL
  4. หากใช้งานจน disk เต็ม จะ clear พื้นที่ disk ให้ใช้งานต่อยาก เพราะการสั่ง delete row ไม่ทำให้ฐานข้อมูลเล็กลง!! ต้องสั่ง compact เองซึ่งต้องมีที่ว่างที่ disk อีกลูกมากพอๆ กับพื้นที่ข้อมุลที่ใช้อยู่ปัจจุบันเป็น buffer ในการลดขนาด (การลดขนาดจริงๆ คือการสร้างใหม่มาเลยอีกก้อน จึงต้องมี buffer เยอะมาก)
  5. หากต้องการใช้งานเป็นฐานข้อมูลหลักแทน MySQL ควรมีเครื่องอย่างน้อย 3 เครื่องที่เป็น physical แยกกันทำ replication กัน เพื่อเพิ่ม durability ของข้อมูล เนื่องจากข้อมูลส่วนใหญ่ของ MongoDB จะเก็บใน Memory เป็นระยะเวลาหนึ่ง หากเครื่องดับไปเครื่อง ข้อมูลที่ยังค้างใน Memory แต่ยังไม่ write ลง disk จะสูญหายทันที

สำหรับผมตอนนี้ใช้งาน MongoDB แค่เพียงส่วนของ Log เนื่องจากยอมให้ durability ต่ำไปนิดหน่อยได้ครับ ส่วนอื่นๆ ยังคงใช้ MySQL ตามปกติ ขอให้โชคดีกับการ Scale ระบบของคุณนะครับ :)

Enjoy this article?

Consider subscribing to our RSS feed!

6 ความเห็น

  1. katopz
    21:16 on November 29th, 2012

    ขอบคุณครับ ได้ความรู้มาเต็ม :D ว่าแต่เรื่องความปลอดภัยมีอะไรต้องกังวลเหมือน SQL injection หรือเปล่าครับ?

  2. heha
    00:50 on November 30th, 2012

    ผมเก็บแต่ข้อมูลที่ระบบ generate มาให้ ไม่มีข้อมูลจากฝั่ง user เลยบอกไม่ได้ครับ

  3. danya
    01:20 on April 17th, 2013

    กำลังสนใจเลย ผมทำเกมออนไลน์ ระบบ Log แค่ Insert มัน Crash บ่อย ทำให้เว็บล้มประจำ

  4. SBO
    15:52 on January 27th, 2015

    ขอบคุณมากครับ สำหรับข้อมูลดีๆแบบนี้

  5. Chaichana
    17:56 on December 5th, 2015

    เพิ่งเริ่มศึกษา MongoDB ครับ ขอบคุณสำหรับข้อมูลดีๆ ครับ

ใส่ความเห็น

RSS feed for comments on this post

 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน