10 December 2013

แค่ BETWEEN ชีวิตก็เปลี่ยน (SQL)

แม้ว่าจะเคยทำ MySQL Database มาระยะหนึ่ง แต่ก็ยังโง่ในเรื่องง่ายๆ ปัญหานี้เกิดตอนที่ต้องทำสารนิพนธ์ เพื่อทำการเปรียบเทียบตัวแปรวันที่ (Datetime)

ความเข้าใจที่ว่า วันที่เป็นความหมายของ Floating point ที่สามารถเอามาเปียบเทียบกันได้ตามปกติ โดยการออกแบบ SQL เพื่อหาช่วงวันที่

SELECT `proxy_id` FROM `log_proxy`
WHERE `datetime` >= DATE_SUB('".$rs_InterestNamedItemROW["datetime"]."', INTERVAL 5 SECOND) 
AND `datetime` <= DATE_ADD('".$rs_InterestNamedItemROW["datetime"]."', INTERVAL 5 SECOND);

ดูเผินๆก็ไม่น่ามีอะไร เพราะ SQL เป็นการค้นหาข้อมูลว่ามีอะไรอยู่ภายในกรอบเวลาที่เรากำหนดบ้าง ซึ่งผลที่ได้เมื่อทำการทำงานซ้ำไปเรื่อยๆ ระยะเวลาต่อ Query กลับเพิ่มขึ้นจากที่เป็น 0.15 วินาที เพิ่มไปเป็น 4 วินาทีต่อ 1 Query ดังนั้นถ้าเฉลี่ยซะว่า เรามีข้อมูลอยู่ 1.2 ล้านแถวที่ต้องทำงานด้วย มีระยะเวลาเฉลี่ยที่ประมาณ 3 วินาที จะต้องใช้เวลาประมวลผมทั้งหมด 3,600,000 วินาที หรือใช้ประมาณ 41 วัน

แบบนี้กแย่น่ะสิ เพราะเดือนหน้าต้องส่งงานแล้ว ตัดใจแก้ไขปัญหาโดยการเพิ่ม index เข้าไปที่ Column `datetime`

เกือบจะดีใจกับผลที่ได้รับ เพราะใช้เวลาลดลงมาก จาก 41 วัน เหลือ 6 วัน แต่ก็ไม่ไหว ยังนานอยู่ดี

การเปรียบเทียบประเภทของข้อมูลรูปแบบ Date and Time ใน MySQL ประสิทธิภาพจะไม่ค่อยดีนักในการเปรียบเทียบ ด้วยเหตุนี้ทางเลือกอีกด้านหนึ่งจึงมีแค่ BETWEEN ในการทำงาน เปลี่ยน Query ที่ง่ายอยู่แล้ว ไปเป็นแบบง่ายอีกแบบ

SELECT `proxy_id` FROM `log_proxy`
WHERE `datetime` BETWEEN DATE_SUB('".$rs_InterestNamedItemROW["datetime"]."', INTERVAL 5 SECOND) 
AND DATE_ADD('".$rs_InterestNamedItemROW["datetime"]."', INTERVAL 5 SECOND);

แปลกแต่จริง ทุก Query ทำงานได้ที่ความเร็วเฉลี่ย 0.00012 sec หรือใช้เวลาประมาณ 2 นาที 24 วินาที ในการประมวลผลข้อมูลทั้ง 1.2 ล้านแถวอันเดิม

ทำไมชีวิตมันช่างต่างกันแบบนี้ จาก 6 สัปดาห์เป็นแค่ 2 นาที เท่านั้นเอง แหม่ ...

Written by Tiwakorn Laophulsuk

No comments:

Post a Comment

Give a comment ...