นี่เป็น 1 ใน 2 query ที่ DBA แจ้งมาว่ามีปัญหาครับ (อีกอันกำลองลองดูๆอยู่ น่าจะแก้ได้เองครับ)
(MySQL นะครับ)
โค้ด: เลือกทั้งหมด
SELECT DISTINCT record_date FROM inputs WHERE userID = "A114124" AND deleted_on = "0000-00-00" AND record_date BETWEEN "2012-01-01" AND "2012-03-31" ORDER BY record_date
inputs เป็น table ที่เก็บ transaction ของ user แต่ละคน ในแต่ละวันจะมีจำนวน 1 - 2 record maximum เท่าที่เจอคือประมาณวันละ 100 records / 1 user
แต่ละวันมีจำนวน user ที่เข้ามาใช้ระบบไม่แน่นอน แต่อยู่ราวๆ 10 - 200 คน เฉลี่ยมี record เพิ่มขึ้นประมาณ 5000 record / วัน ตอนนี้เบ็ดเสร็จอยู่ที่ราวๆ 650,000 record ครับ
table มีแนวโน้มจะโตขึ้นเรื่อยๆ และแนวโน้มจะมากกว่าเดิมขึ้นเรื่อยๆครับ
(table structure มี field id เป็น PK ตัวเดียว ไม่มี index อื่นครับ)
คิดว่า ที่ DBA บ่นว่าช้า น่าจะมาจาก query นี้ ต้อง table scan เพื่อหาผลลัพธ์ออกมาเลย แต่ผมก็ไม่รู้ว่าจะแก้ query ให้มันเร็วกว่านี้ได้ยังไงแล้ว -_-''
วิธีแก้เท่าที่นึกออกตอนนี้ ก็คือ
A.) ทำ summary table ออกมา (ใน table input จะมี field ที่ต้อง summary เป็นยอดรวมที่ใช้ในส่วนงานอื่นอีกที)
เพื่อเปลี่ยนจากการทำ table scan ขนาดใหญ่ มาสู่ table scan ที่เล็กกว่า แต่ต้องไปตามแก้ script ที่จัดการข้อมูลของ table inputs ให้มาคอย update summary table ด้วย
กับ B.) เนื่องจากต้องมีการแก้ไข script ซึ่งมี cost พอสมควร ก็เลยจะเอา cost ตรงนี้ไปเสนอให้ upgrade hardware ก่อนเลย (แล้วตัว script จะตามมาทีหลัง)
คำถามนะครับ
1.) มีอะไรที่ผมพอจะทำได้เกี่ยวกับ table inputs นี้เพื่อเพิ่มความเร็วให้ script อีกได้ไหมครับ
2.) แนวคิด A.) ของผมถูกต้องไหมครับ มีอะไรพอจะเสริมให้มันเร็วขึ้นได้อีกไหมครับ
ขอบคุณครับ