พื้นหลัง :
ฉันได้สร้างเว็บแอปพลิเคชันที่ฉันต้องการให้สามารถปรับขนาดได้อย่างเหมาะสม ฉันรู้ว่าฉันไม่ใช่ Google หรือ Twitter แต่แอพของฉันใช้ข้อมูลจำนวนมากสำหรับผู้ใช้แต่ละรายและมีข้อกำหนดด้านข้อมูลที่ค่อนข้างสูง ฉันต้องการที่จะพร้อมที่จะไต่ระดับอย่างมีเหตุผลโดยไม่ต้องสร้างใหม่ทุกอย่างในภายหลัง
ฉันถือว่าตัวเองเป็นนักพัฒนาซอฟต์แวร์ไม่ใช่ผู้เชี่ยวชาญด้านฐานข้อมูล นั่นเป็นเหตุผลที่ฉันโพสต์ที่นี่ หวังว่าคนที่มีความเชี่ยวชาญด้านฐานข้อมูลจำนวนมากสามารถให้คำแนะนำแก่ฉันได้
ด้วยจำนวนผู้ใช้ค่อนข้างมาก แต่ไม่มีอะไรเหมือนหมายเลข Facebook ฉันคาดว่าจะมีฐานข้อมูลที่มีลักษณะดังนี้:
หนึ่ง "โต๊ะใหญ่":
- 250 ล้านแผ่น
- 20 คอลัมน์
- ข้อมูลประมาณ 100 GB
- มีคีย์ต่างประเทศที่มีการจัดทำดัชนี (20)
- มีคอลัมน์ string_id varchar (500) ที่จัดทำดัชนี
- มีคอลัมน์ "ค่า" int (11)
4 ตารางอื่น ๆ :
- 10 ล้านแผ่นต่อแผ่น
- แต่ละข้อมูลประมาณ 2 - 4 GB
- แต่ละตารางเหล่านี้มี 4 - 8 คอลัมน์
- หนึ่งคอลัมน์คือวันที่และเวลา dat_created
- หนึ่งคอลัมน์คือคอลัมน์ varchar (500) string_id
- หนึ่งหรือสองคอลัมน์จากแต่ละตารางเหล่านี้จะถูกเลือกในการเข้าร่วม
หนึ่งในตารางเหล่านี้ใช้สำหรับจัดเก็บค่าเฉลี่ย - สคีมาคือ bigint (20) id, varchar (20) string_id, วันที่และเวลา dat_created, float average_value
ฉันต้องการทำอะไร - มีข้อความค้นหาสองรายการที่ค่อนข้างแพง:
คำนวณค่าเฉลี่ยใหม่:
- การใช้กุญแจต่างประเทศให้เลือกระเบียนที่แยกต่างหากได้มากถึงหลายล้านรายการจากตารางขนาดใหญ่
- คำนวณค่าเฉลี่ยใหม่จัดกลุ่มโดย string_id
- แทรกผลลัพธ์ลงในตารางค่าเฉลี่ย
- ตามที่สร้างขึ้นในปัจจุบันแบบสอบถามนี้ใช้การรวมสองรายการ
สร้างบันทึกแบบไม่ตัดทอนให้อ่านได้อย่างเดียวสำหรับการให้บริการผู้ใช้:
- ใช้รหัสต่างประเทศเพื่อเลือกจาก 1,000-40,000 รายการจากตารางใหญ่
- เข้าร่วมกับตารางสี่ตารางอื่น ๆ ในระเบียนใหม่ล่าสุดด้วยคอลัมน์ id สตริง
- แทรกผลลัพธ์ลงในตารางที่ถูกทำให้เป็นมาตรฐาน
- ระเบียนเหล่านี้ใช้สำหรับส่วนหน้าเพื่อแสดงข้อมูลแก่ผู้ใช้
- ตามที่สร้างขึ้นในปัจจุบันแบบสอบถามนี้ใช้การรวมสี่รายการ
ฉันวางแผนที่จะเรียกใช้แบบสอบถามที่มีราคาแพงเหล่านี้ในฐานข้อมูลแบ็คเอนด์แบบแบ็กเอนด์ซึ่งจะส่งผลลัพธ์ไปยังเซิร์ฟเวอร์ฐานข้อมูลแบบเรียลไทม์ซึ่งจัดการคำขอจากผู้ใช้ แบบสอบถามเหล่านี้จะทำงานในช่วงเวลาปกติ ฉันไม่ได้ตัดสินใจบ่อยแค่ไหน แบบสอบถามเฉลี่ยสามารถทำได้บางทีวันละครั้ง การยกเลิกการทำให้ปกติจะต้องมีความถี่มากขึ้น - บางทีทุกสองสามนาที
แต่ละคำสั่งเหล่านี้ทำงานในไม่กี่วินาทีใน MySQL บนเครื่องต่ำสุดที่มีชุดข้อมูลที่มีการบันทึก 100K ใน“ ตารางใหญ่” ฉันกังวลเกี่ยวกับความสามารถในการขยายและต้นทุนการปรับขนาด
คำถาม :
- วิธีนี้ดูดีไหม? เห็นได้ชัดว่ามีอะไรผิดปกติกับมุมมองภาพใหญ่หรือไม่?
- RDBMS เป็นเครื่องมือที่เหมาะสมหรือฉันควรดูโซลูชัน "ข้อมูลขนาดใหญ่" อื่น ๆ เช่นบางอย่างในตระกูล Hadoop หรือไม่? ความชอบของฉันคือการใช้ RDBMS เพราะข้อมูลมีโครงสร้างและเหมาะสมกับโมเดลเชิงสัมพันธ์ ถึงจุดหนึ่งมันเป็นความเข้าใจของฉันว่าฉันอาจไม่สามารถใช้ RDBMS ได้อีกต่อไป มันเป็นเรื่องจริงเหรอ? สวิตช์นี้จำเป็นเมื่อใด
- มันจะทำงานอย่างไร คำค้นหาเหล่านี้สามารถทำงานในระยะเวลาที่เหมาะสมได้หรือไม่? ฉันสามารถรอคิวชั่วโมง # 1 ได้ แต่แบบสอบถาม # 2 ควรเสร็จในไม่กี่นาที
- ฉันควรพิจารณาอะไรจากมุมมองของฮาร์ดแวร์ คอขวด RAM และ CPU ของฉันมีแนวโน้มที่จะเป็นอย่างไร ฉันถือว่าการเก็บดัชนีใน RAM เป็นสิ่งสำคัญ มีอะไรอีกบ้างที่ฉันควรพิจารณาอีก
- ในบางครั้งฉันอาจต้องแบ่งพาร์ติชั่นข้อมูลของฉันและใช้เซิร์ฟเวอร์หลายเครื่อง กรณีการใช้งานของฉันดูเหมือนว่ามีอยู่แล้วในหมวดหมู่นั้นหรือไม่หรือฉันจะสามารถปรับขนาดเครื่องเดียวในแนวตั้งได้ชั่วขณะ สิ่งนี้จะทำงานกับข้อมูล 10 เท่าหรือไม่ 100x?