ปรับปรุง sql กันหน่อย

Select count() vs Select single column

ปัญหาที่พบเจอ วันนี้มานั่ง 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 วินาที

พอเห็นตัวเลขการทำงานแบบนี้แล้ว

ทำให้ง่ายมาก ๆ ต่อการตัดสินใจต่อการแก้ไข ว่าจะทำอย่างไร !! ค่อย ๆ ปรับปรุงกันต่อไป

ผลจากการแก้ไข โลกสงบสุขขึ้นเยอะ

0
220