Database
น้องๆ เคยเจอปัญหา database ช้า อืดไหม? สมัยผมทำร้านเน็ตคาเฟ่ SiamCafe.net เมื่อก่อนนี่ เจอบ่อยมาก! เด็กๆ กำลังเล่นเกมออนไลน์กันมันส์ๆ อยู่ดีๆ แล้วแลคกระจาย เพราะ database มันทำงานไม่ทันใจ Postgresql Performance Tuning Guide เนี่ยแหละ คือตัวช่วยให้ database ของเราทำงานได้เร็วขึ้น ตอบสนองได้ไวขึ้น เหมือนบูสต์เครื่องคอมพ์ให้แรงขึ้นนั่นเอง
ทำไมมันถึงสำคัญ? ก็เพราะว่าถ้า database เราช้า ทุกอย่างก็ช้าไปหมด! เว็บไซต์โหลดนาน, application หน่วง, เกมกระตุก... เสียหายทั้งเงิน ทั้งความรู้สึกคนใช้งาน Performance tuning เลยเป็นเรื่องที่คนทำระบบต้องใส่ใจมากๆ ครับ
ก่อนจะไปปรับจูนอะไรกันเยอะแยะ เราต้องเข้าใจพื้นฐานของ Postgresql กันก่อนนะ
อันนี้สำคัญมาก! Query Execution Plan คือแผนการทำงานที่ Postgresql ใช้ในการ execute query ของเรา มันบอกว่า Postgresql จะอ่าน table ไหนก่อน, ใช้ index อะไร, join table ยังไง ฯลฯ การเข้าใจ Execution Plan จะช่วยให้เรารู้ว่า query ของเรามันช้าตรงไหน แล้วเราจะแก้ยังไงได้
วิธีดู Execution Plan ง่ายๆ คือใช้คำสั่ง EXPLAIN SiamCafe Blog ลองดูตัวอย่าง:
EXPLAIN SELECT * FROM orders WHERE customer_id = 123;
ผลลัพธ์ที่ได้ จะบอกรายละเอียดต่างๆ ที่ Postgresql ใช้ในการ execute query นี้
Index เปรียบเหมือนสารบัญในหนังสือ ช่วยให้เราค้นหาข้อมูลได้เร็วขึ้นมากๆ สมัยผมทำร้านเน็ต ผมเคยเจอ database ที่ไม่มี index เลย! พอ run query ที รอเป็นชาติ การสร้าง index ที่เหมาะสม จะช่วยลดเวลาในการ query ได้อย่างมหาศาล
แต่! Index ไม่ใช่ยาวิเศษ ใส่เยอะไปก็ไม่ดีนะ เพราะมันจะทำให้การ write ข้อมูลช้าลง และเปลืองพื้นที่จัดเก็บ ดังนั้นเราต้องสร้าง index เฉพาะ column ที่เราใช้ query บ่อยๆ เท่านั้น
เริ่มต้นง่ายๆ เลย คือต้องรู้ก่อนว่า database เรามีปัญหาตรงไหน ช้าตรงไหน แล้วค่อยๆ แก้ไปทีละจุด
pg_stat_statements เป็น extension ที่ช่วยเก็บสถิติการทำงานของ query ต่างๆ ใน database เรา มันจะบอกว่า query ไหนถูก execute บ่อยที่สุด, ใช้เวลานานที่สุด, กิน resource มากที่สุด
วิธีใช้งานก็ง่ายๆ แค่ enable extension นี้ใน database ของเรา:
CREATE EXTENSION pg_stat_statements;
จากนั้น เราก็สามารถ query ข้อมูลจาก view pg_stat_statements ได้เลย:
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
query นี้จะแสดง 10 query ที่ใช้เวลานานที่สุด
ANALYZE คือคำสั่งที่ใช้ update สถิติของ table ต่างๆ ใน database สถิติเหล่านี้จะถูกใช้โดย Query Optimizer เพื่อเลือก Execution Plan ที่ดีที่สุด ถ้าสถิติไม่ update Query Optimizer อาจจะเลือก Execution Plan ที่ไม่ดี ทำให้ query ช้า
VACUUM คือคำสั่งที่ใช้ reclaim พื้นที่ที่ถูกใช้งานโดย tuple ที่ถูก delete หรือ update ถ้าเราไม่ได้ vacuum เป็นประจำ database เราก็จะเต็มไปด้วย dead tuple ทำให้ query ช้าลง
เราสามารถ run ANALYZE และ VACUUM ได้ด้วยคำสั่ง:
ANALYZE verbose;
VACUUM verbose;
หรือจะตั้ง cron job ให้ run เป็นประจำก็ได้ SiamCafe Blog
Postgresql ไม่ได้เป็น database ตัวเลือกเดียวในโลกนี้ ยังมี database อื่นๆ อีกมากมายที่น่าสนใจ แต่ละตัวก็มีข้อดีข้อเสียต่างกันไป
| Database | ข้อดี | ข้อเสีย | เหมาะกับ |
|---|---|---|---|
| Postgresql | Open source, มี feature เยอะ, รองรับ SQL standard ได้ดี | อาจจะ configure ยากกว่าบางตัว | Application ขนาดกลางถึงใหญ่ที่ต้องการความน่าเชื่อถือและความยืดหยุ่น |
| MySQL | ใช้งานง่าย, มี community ใหญ่, มี hosting ให้เลือกเยอะ | บาง feature อาจจะสู้ Postgresql ไม่ได้ | Application ขนาดเล็กถึงกลางที่ต้องการความรวดเร็วในการพัฒนา |
| MongoDB | NoSQL, ยืดหยุ่น, เหมาะกับ data ที่ไม่มี structure แน่นอน | ACID compliance อาจจะไม่ดีเท่า SQL database | Application ที่ต้องการความยืดหยุ่นในการจัดการข้อมูล |
เลือก database ตัวไหน ก็ขึ้นอยู่กับ requirement ของโปรเจกต์เราครับ ไม่มี database ตัวไหนที่ดีที่สุดในทุกกรณี
เอาล่ะน้องๆ มาถึงส่วนที่สำคัญที่สุดแล้ว นั่นคือ "เคล็ดลับจากประสบการณ์จริง" ที่พี่บอมสั่งสมมาตั้งแต่สมัยเปิดร้านเน็ตคาเฟ่ SiamCafe.net ยุคบุกเบิก Postgresql เนี่ยมันเหมือนรถแข่ง Formula 1 นะ ถ้าจูนไม่ดี ก็วิ่งอืดเป็นเต่าได้เหมือนกัน
สมัยก่อนเน็ตคาเฟ่เนี่ย ทุกวินาทีมีค่า ลูกค้าเล่นเกมกระตุกทีนี่โดนด่าเช็ดเลย ดังนั้นเรื่อง Performance เนี่ยสำคัญสุดๆ พี่เลยต้องขุดคุ้ยทุกซอกทุกมุมของ Postgresql เพื่อให้ร้านรันได้ลื่นปรื๊ด
มาดูกันว่าพี่มีอะไรเด็ดๆ มาฝากบ้าง:
อันนี้เบสิค แต่สำคัญมาก! Postgresql มันฉลาดนะ แต่มันต้อง "รู้" ก่อนว่าข้อมูลใน Table เราเป็นยังไงบ้าง การ Analyze Table จะช่วยให้มันสร้าง Query Plan ที่ดีที่สุดได้
ANALYZE my_table;
ถ้า Table ใหญ่มาก แนะนำให้ทำเป็น Cron Job รันทุกวัน หรือทุกสัปดาห์ แล้วแต่ความถี่ในการเปลี่ยนแปลงข้อมูล
Index เนี่ยเหมือนทางลัด ถ้าเราใส่ Index ผิดที่ แทนที่จะเร็ว กลับจะช้ากว่าเดิมอีก! ต้องวิเคราะห์ Query ที่ใช้บ่อยๆ แล้วดูว่า Where Clause ใช้ Column ไหนบ้าง ก็สร้าง Index บน Column นั้นแหละ
CREATE INDEX idx_my_table_column ON my_table (my_column);
แต่จำไว้ว่า Index เยอะไปก็ไม่ดี เพราะตอน Insert/Update/Delete จะต้อง Update Index ด้วย ทำให้ช้าลง
ถ้า Query มันอืดๆ อย่าเพิ่งโทษ Postgresql อย่างเดียว ลองใช้ Explain ดู Query Plan ก่อนว่ามันทำอะไรบ้าง มันจะบอกหมดเลยว่ามันใช้ Index อะไร หรือมัน Full Table Scan หรือเปล่า
EXPLAIN ANALYZE SELECT * FROM my_table WHERE my_column = 'something';
ผลลัพธ์ที่ได้อาจจะอ่านยากหน่อย แต่ Google ช่วยท่านได้! หรือจะมาถามพี่ก็ได้ ถ้ารู้ก็จะบอก
สมัยร้านเน็ต พี่เจอปัญหา Client connect มาที่ Database เยอะๆ แล้ว Database มันรับไม่ไหว ทำให้ช้าไปหมด Connection Pooling เนี่ยจะช่วยแก้ปัญหานี้ได้ โดยการสร้าง Connection Pool ไว้ล่วงหน้า แล้วให้ Client มาหยิบใช้เอา ไม่ต้องสร้าง Connection ใหม่ทุกครั้ง
มี Tool หลายตัวให้ใช้ เช่น PgBouncer หรือ psql อีกอย่างนึงที่สำคัญคือการ close connection หลังจากใช้งานเสร็จแล้ว
Postgresql มันออกแบบมาให้ใช้ Resource อย่างเต็มที่ เพื่อให้ได้ Performance ที่ดีที่สุด ถ้า Resource เหลือเยอะ แล้วมันไม่ใช้เนี่ย จะเรียกว่าฉลาดเหรอ?
Autovacuum เนี่ยเหมือนคนทำความสะอาดบ้าน ถ้าไม่ทำความสะอาด บ้านก็จะรก Database ก็เหมือนกัน Autovacuum จะช่วยเก็บกวาดข้อมูลเก่าๆ ที่ไม่ได้ใช้แล้ว ทำให้ Database สะอาดอยู่เสมอ
Postgresql มันฉลาด (อีกแล้ว!) มันจะเลือกใช้ Index เมื่อมันคิดว่าการใช้ Index จะเร็วกว่า Full Table Scan ถ้า Table เล็กๆ หรือ Query มันซับซ้อนมากๆ มันอาจจะเลือก Full Table Scan ก็ได้
มี Tool หลายตัวให้ใช้ เช่น pgAdmin, Grafana, Prometheus ลองหาดูที่เหมาะกับเรา ถ้าเป็นพี่ พี่จะเขียน Script ง่ายๆ ดึงข้อมูลจาก pg_stat_database มาดู แล้ว plot graph เอา
Postgresql Performance Tuning เนี่ยมันเป็นศาสตร์และศิลป์ ต้องลองผิดลองถูกไปเรื่อยๆ ไม่มีสูตรสำเร็จตายตัว สิ่งสำคัญคือต้องเข้าใจว่า Postgresql มันทำงานยังไง แล้วก็ต้อง Monitor อย่างสม่ำเสมอ
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย ที่ SiamCafe Blog หรือจะมาคุยเรื่อง Forex ที่ iCafeForex ก็ยินดี