ปัญหาที่พบเจอ
วันนี้มานั่ง review code และ metric การใช้งาน
ของระบบ API ที่เชื่อมต่อกับ MySQL database
พบว่ามี API ตัวหนึ่งมี response time ที่สูงขึ้นมาก
จะเจอมากขึ้นเมื่อมีผู้ใช้งานมากขึ้น
ซึ่งเป็นปัญหาที่พบเจอได้บ่อยมาก ๆ
ก็เลยไป review code และดู SQL query กันหน่อย
สิ่งที่พบเจอคือ
ใน logic การทำงาน ต้องการตรวจสอบว่า
ข้อมูลผู้ใช้งานเป็นไปตามเงื่อนไขที่กำหนดหรือไม่ ?
โดยทำการเขียน SQL ด้วย SELECT id FROM USERS WHERE conditions;
ปัญหาแรกที่เจอคือ มี index แต่ไม่มีประสิทธิภาพ
เลยแก้ไขไปก่อน ก็ดีขึ้น เรื่องนี้พลาดบ่อยมาก ๆ
ปัญหาต่อมาคือ สิ่งที่ select ออกมานั้น ไม่ได้ใช้งาน
เพียงแค่ตรวจสอบว่า มีข้อมูลหรือไม่เท่านั้นเอง
ดังนั้นจึงลองเปลี่ยนไปใช้งาน 2 แบบคือ
- SELECT count(1)
- SELECT with EXISTS
ผลที่ได้การ query ใช้เวลา fetch time ดังนี้
- SELECT id = 0.000010 - 0.000020 วินาที
- SELECT count และ exists ใช้เวลาพอ ๆ กัน = 0.0000060 - 0.0000080 วินาที
พอเห็นตัวเลขการทำงานแบบนี้แล้ว
ทำให้ง่ายมาก ๆ ต่อการตัดสินใจต่อการแก้ไข ว่าจะทำอย่างไร !!
ค่อย ๆ ปรับปรุงกันต่อไป
ผลจากการแก้ไข โลกสงบสุขขึ้นเยอะ