ความเข้าใจที่ว่า วันที่เป็นความหมายของ 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 ...