เว็บแอปพลิเคชันส่วนใหญ่ใช้ที่เก็บข้อมูลบางประเภท ซึ่งมักเป็นฐานข้อมูลเชิงสัมพันธ์ เมื่อเว็บแอปประสบความสำเร็จ การเริ่ม "กักตุน" ข้อมูลในฐานข้อมูลอาจกลายเป็นเรื่องง่ายเกินไป แต่การกักตุนข้อมูลนำไปสู่การเติบโตของตารางฐานข้อมูลอย่างไม่มีขอบเขต (ทั้งจำนวนแถวและขนาดข้อมูลที่จัดเก็บ)
แม้ว่าวิธีนี้จะทำงานได้ดีในบางจุด แต่ก็มีประโยชน์มากในการป้องกันไม่ให้ข้อมูลบางส่วนขยายตัว หรือหากคุณไม่สามารถป้องกันได้ ให้วางแผนโครงสร้างพื้นฐานล่วงหน้าเพื่อจัดการการเติบโตอย่างเพียงพอ
ก่อนที่เราจะเจาะลึก มาดูกันว่าเราอาจจบลงด้วยแอปพลิเคชันที่ล้นหลามได้อย่างไร
ข้อมูลเพิ่มเติมไม่ได้ดีเสมอไป
แอปพลิเคชันส่วนใหญ่ที่เราทำงานมีแนวโน้มที่จะมีขนาดใหญ่ขึ้นเมื่อเวลาผ่านไป
หากคุณใช้ผู้ให้บริการคลาวด์สำหรับฐานข้อมูลของคุณ คุณอาจใช้พื้นที่จัดเก็บข้อมูลถึงขีดจำกัดที่จัดสรรไว้ เมื่อเกิดเหตุการณ์เช่นนี้ คุณจะต้องอัปเกรดเป็นอินสแตนซ์ประเภทอื่น ฐานข้อมูล Heroku PostgreSQL มีขีดจำกัด เช่น อินสแตนซ์ระดับ "งานอดิเรก" ถูกจำกัดไว้ที่ข้อมูล 1GB
การมีข้อมูลเพิ่มเติมยังส่งผลต่อความเร็วในการสืบค้นด้วย สิ่งที่เคยเป็นไปได้หากไม่มีดัชนีจะกลายเป็นสิ่งที่เป็นไปไม่ได้เมื่อมีตารางขนาดใหญ่ขึ้น การสแกนช่วงแถวบางช่วงจะช้าลง จะได้รับล็อคเพิ่มเติมเพื่อทำฐานข้อมูล 01 และ 13รหัส> การดำเนินงาน
ตารางฐานข้อมูลเติบโตอย่างไร
การกักตุนข้อมูลจะเกิดขึ้นทีละน้อย สิ่งที่ไม่ใช่ปัญหาในปัจจุบันสามารถกลายเป็นปัญหาได้ง่ายๆ ในหนึ่งเดือนหรือหกเดือน สิ่งที่เลวร้ายที่สุดเกี่ยวกับการกักตุนข้อมูลก็คือการพลาดได้ง่ายมาก พิจารณาสถานการณ์คลาสสิกบางประการ:
- ด้วยเหตุผลด้านการปฏิบัติตามข้อกำหนด คุณจึงใช้อัญมณีเช่น
20และรับ30ตาราง ทุกการดำเนินการที่มีระดับความสำคัญในแอปพลิเคชันของคุณจะสร้างแถวใน47ตาราง รายการบันทึกการตรวจสอบเหล่านั้นจะไม่ถูกเก็บถาวร - คุณยอมรับการอัปโหลดและกำลังใช้งาน ActiveStorage คุณไม่เคยลบการอัปโหลด ดังนั้น
55ของคุณ โต๊ะก็ใหญ่ขึ้นเรื่อยๆ - คุณใช้งาน CMS ที่ใช้ร่วมกันสำหรับการเผยแพร่บนเว็บ และคุณอนุญาตให้เก็บส่วนของบทความไว้ในฐานข้อมูลของคุณ แพลตฟอร์มของคุณประสบความสำเร็จ แต่ผู้เขียนส่วนใหญ่ของคุณเขียนบทความขนาดเท่าหนังสือ
60รหัส> ตารางมีขนาดใหญ่มากแม้ว่าจะมีเพียงไม่กี่พันหน้าก็ตาม - คุณอนุญาตเนื้อหาที่ผู้ใช้อัปโหลด แต่คุณไม่ได้ลบข้อมูลด้วยเหตุผลด้านการปฏิบัติตามข้อกำหนด และใช้เนื้อหาเช่น
74แทน เพื่อลบผ่านแฟล็ก86ของคุณ ตารางขยายไปเรื่อยๆ และผ่านไป 10 ล้านแถวโดยที่คุณไม่รู้
รูปแบบเหล่านี้มีผลกระทบหากไม่ทันเวลา หากคุณมีมุมมองที่ดีเกี่ยวกับขนาดของตาราง คุณสามารถคาดการณ์ได้ว่าเมื่อใดที่คุณจะต้องอัปเกรดและกำหนดเวลาการบำรุงรักษาในช่วงเวลาที่มีการใช้งานน้อย เพื่อดำเนินการอัปเกรดโดยมีผลกระทบต่อผู้ใช้น้อยลง
การฉายภาพจะง่ายขึ้นมาก ตัวอย่างเช่น:
- วันนี้
99ของเรา ตารางพอดีกับหน่วยความจำ ด้วยอัตราการเติบโตในปัจจุบัน มันจะไม่พอดีกับหน่วยความจำในอีกเจ็ดเดือน - เราใช้พื้นที่เก็บข้อมูล 30% สำหรับประเภทอินสแตนซ์ RDS ของเรา เราจะแตะ 90% ในเดือนมกราคมปีหน้า
- เรามีแบบสอบถามสแกนตารางแบบเต็มใน
106เพื่อคำนวณฟังก์ชันในทุกแถวที่อินพุตขึ้นอยู่กับแบบสอบถาม เรารู้ว่า119ตารางจะเกินสองล้านแถวในสามสัปดาห์และ 20 ล้านแถวภายในเดือนมกราคมปีหน้า
สิ่งเหล่านี้ล้วนมีศักยภาพที่จะนำเสนอเป็นเหตุการณ์หรือการหยุดทำงาน แต่ถ้าคุณโจมตีเร็วพอ คุณสามารถบรรเทาผลกระทบนี้ได้อย่างง่ายดาย ตัวอย่างเช่น:
- ตั้งค่าการเก็บถาวรสำหรับข้อมูลทั้งหมดที่เก่ากว่า 30 วันใน
126ตาราง - อัปเกรดอินสแตนซ์ RDS ของคุณในสี่เดือน
- หากต้องการจำกัดการสแกนตารางทั้งหมด ให้เพิ่ม
137เพิ่มเติม กำหนดเงื่อนไขให้กับแบบสอบถามของเราเพื่อคำนวณฟังก์ชันบนชุดย่อยของแถวที่เล็กกว่ามากแทน
มองเห็นได้ชัดเจนเหนือการเติบโตของฐานข้อมูลของคุณ
เพื่อจับตาดูการเติบโตของฐานข้อมูลของคุณ คุณมีสองความเป็นไปได้:
- ติดตั้งเครื่องมือพิเศษ (เช่น สถิติสำหรับ MySQL) และเชื่อมต่อกับเครื่องมือรวบรวมตัวชี้วัดของคุณผ่าน Prometheus, Telegraph หรือเครื่องมืออื่นๆ
- ใช้ AppSignal โดยเฉพาะอย่างยิ่งหากคุณใช้งานกับแอปพลิเคชันของคุณอยู่แล้ว
AppSignal สามารถจัดเก็บประเภทเมตริกได้หลายประเภท และประเภทเมตริกประเภทหนึ่งที่รองรับเรียกว่า 142 . 150รหัส> เป็นอนุกรมเวลาเดียวต่อสภาพแวดล้อม (เช่น 169 , 178รหัส> หรือ 182 ) ที่คุณสามารถอัปเดตได้เป็นครั้งคราว ตัววัด AppSignal ยังอนุญาตให้ใช้แท็กได้ ดังนั้นเราจึงสามารถสร้างแท็ก 191 บางส่วนได้โดยอัตโนมัติ ตัวชี้วัดสำหรับตารางฐานข้อมูลของเรา มาทำกันเถอะ:
205รหัส> สำหรับจำนวนแถวโดยประมาณในตารางของเราต่อตาราง (เราจะพูดถึงค่าประมาณในภายหลัง)210รหัส> สำหรับจำนวนไบต์ที่ตารางใช้224รหัส> สำหรับจำนวนไบต์ที่ดัชนีของตารางใช้
โปรดทราบว่าฉันกำลังต่อท้ายชื่อเมตริกด้วยประเภทค่า ซึ่งจะช่วยได้ในภายหลังเมื่อเรากำหนดวิธีการแสดงเมตริก เมตริก "ข้อมูล" และ "ดัชนี" ที่แยกจากกันก็มีความสำคัญเช่นกัน หากตารางประกอบด้วยแถวจำนวนมากและมีดัชนีมากกว่าสองสามรายการ ขนาดของดัชนีเหล่านั้นอาจมีขนาดใหญ่กว่าข้อมูลที่จัดเก็บไว้สองหรือสามเท่า (เนื่องจากทุกดัชนีจะจัดเก็บข้อมูลที่ได้รับไว้สำหรับตัวมันเอง ทำให้เกิดค่าใช้จ่ายในการจัดเก็บข้อมูลบางส่วน)
การนับแถวตารางฐานข้อมูลอย่างรวดเร็ว
ส่วน "โดยประมาณ" ของจำนวนแถวเป็นสิ่งจำเป็น โดยปกติ หากคุณต้องการจำนวนแถวที่แน่นอนในตาราง คุณสามารถดำเนินการค้นหาเช่น 236 . อย่างไรก็ตาม มันอาจจะช้ากว่าที่เราต้องการ
เมื่อคุณ 245 ฐานข้อมูลช่วยให้แน่ใจว่าจำนวนแถวในตารางจะไม่เปลี่ยนแปลงระหว่างการสืบค้น และจะล็อคตารางหรือสร้างธุรกรรมที่แตกต่างในขณะที่การสืบค้นทำงาน ยิ่งตารางมีขนาดใหญ่ การค้นหาก็จะยิ่งช้าลง — แถวจะถูกสแกนมากขึ้น และจะมีการล็อกมากขึ้น
ดังนั้นเมื่อเราต้องการเพียงการประมาณจำนวนแถวที่ "ใกล้เคียงเพียงพอ" (สำหรับการประมาณประสิทธิภาพ ความแม่นยำ 10-30,000 แถวที่น้อยกว่าหรือมากกว่านั้นก็เพียงพอแล้ว) เราสามารถใช้สถิติกลไกฐานข้อมูลภายในเพื่อสืบค้นข้อมูลประเภทนี้ได้
ฐานข้อมูลส่วนใหญ่มีการปรับปรุงการเข้าถึงข้อมูลตารางเนื่องจากแถวถูกเขียนเป็น "หน้า" กลไกฐานข้อมูลจะติดตามว่าแถวใดถูกกำหนดให้กับเพจใด โดยคร่าวๆ ตามลำดับการแทรก:
- แถว 1-100 อยู่ในหน้าที่ 1
- แถว 101-200 อยู่ในหน้าที่ 2
- แถว 201-300 อยู่ในหน้าที่ 3
และอื่นๆ
เนื่องจากกลไกรู้ว่ามีกี่หน้าต่อตารางและจำนวนแถวคร่าวๆ ต่อหน้าที่ใช้ จึงสามารถนับหน้าที่จัดสรรไว้ แล้วคูณด้วยขนาดหน้า (แถวต่อหน้า) เพื่อให้ค่าประมาณนั้น ซึ่งมีข้อดีบางประการ:การนับทำได้เร็วมากและไม่จำเป็นต้องล็อกตารางในขณะที่เรียกใช้แบบสอบถาม
บันทึกขนาดตารางสำหรับ MySQL
สิ่งที่เราต้องทำนั้นแตกต่างกันไปในแต่ละฐานข้อมูล เนื่องจากเราจำเป็นต้องสืบค้นกลไกฐานข้อมูลเพื่อดูสถิติของตาราง เริ่มจาก MySQL กันก่อน นี่คือแบบสอบถามที่เราจำเป็นต้องดำเนินการ:
จากนั้นหยิบคอลัมน์สองสามคอลัมน์จากเอาต์พุต สิ่งที่เราสนใจคือ 257 , 268รหัส> และ 270 . ขนาดของตารางถูกกำหนดให้เป็นผลรวมของ 285 และจำนวนแถวโดยประมาณตามหน้าเว็บอยู่ใน 295 .
มารวมไว้ในบล็อคโค้ดที่รวบรวมข้อมูลนี้สำหรับฐานข้อมูลทั้งหมดของคุณ เนื่องจากเราไม่ได้ทำงานกับ 307 ใดๆ เราจะใช้วิธีการสืบค้นที่ ActiveRecord ให้มาโดยตรง:
บันทึกขนาดตารางสำหรับ PostgreSQL
เราต้องการการสืบค้นที่ซับซ้อนมากขึ้นสำหรับ PostgreSQL เนื่องจากเราไม่มีการสืบค้นทางลัดเช่น 319 . เราต้องสืบค้นตาราง PostgreSQL ภายใน:
โปรดทราบว่านี่เป็นเพียงบัญชีสำหรับ 328 เท่านั้น สคีมา (ค่าเริ่มต้นที่คุณน่าจะใช้) หากคุณต้องการรวมสคีมาอื่นๆ คุณจะต้องลบ 333 กำหนดเงื่อนไขและแทนที่ 346 ด้วย 350 .
ตรวจสอบให้แน่ใจว่าเมตริกอัปเดตเป็นประจำ
บล็อกนี้ต้องทำงานในช่วงเวลาสม่ำเสมอ ดังนั้นจึงเป็นความคิดที่ดีที่จะใส่ไว้ในตัวกำหนดเวลา Sidekiq หรืองาน Rake ที่รันจาก cron ตัวอย่างเช่น หากคุณใช้ good_job คุณสามารถเพิ่มมันลงในส่วน "cron" ได้ดังนี้:
สร้างแดชบอร์ด
เมื่อคุณมีข้อมูลเข้ามาแล้ว ให้สร้างแดชบอร์ด คุณสามารถคัดลอกแดชบอร์ดต่อไปนี้ตามความต้องการของคุณ:
คลิก 364 จากนั้น 377 ในกล่องโต้ตอบโมดอลที่ปรากฏขึ้น แดชบอร์ดจะให้กราฟดังนี้:

และกราฟขนาดตารางนี้:

สังเกตวิธีที่เราใช้แท็กไวด์การ์ดเพื่อสร้างกราฟให้กับทุกตารางในฐานข้อมูลโดยอัตโนมัติ
การตีความข้อมูล
เมื่อดูข้อมูลของคุณ ให้มองหาการเติบโตแบบทวีคูณหรือเชิงเส้นทั้งจำนวนแถวหรือขนาด กล่าวคือ ตารางจะใหญ่ขึ้นเรื่อยๆ
หากคุณเห็นสิ่งนี้ แสดงว่าคุณมีสองทางเลือก ประการหนึ่งคือการออกแบบสำหรับการเติบโตที่ไร้ขอบเขตนี้ — รู้ว่าเมื่อใดควรอัปเกรด และดูว่าคุณสามารถอัปเกรดเป็นขนาดที่ดีที่สุดถัดไปได้หรือไม่ อีกประการหนึ่งคือการตั้งค่างานลบตามปกติ — Wander Hillen อดีตเพื่อนร่วมงานของฉันได้เขียนบทความดีๆ ในหัวข้อนี้
ตัวอย่างเช่น ในภาพหน้าจอด้านบน บางตารางจะย่อขนาดลงเป็นประจำ ซึ่งเป็นช่วงที่งานล้างข้อมูลปกติทำงาน คุณจะเห็นว่าข้อมูลสะสมจนถึงจุดหนึ่ง แต่ในขณะที่ทางเข้าของแถวค่อนข้างคงที่ ขนาดและจำนวนแถวก็ลดลง
ตราบใดที่มีการลดลงเหล่านี้และปริมาณข้อมูลในตารางของคุณเพิ่มขึ้นในอัตราที่คงที่ ฐานข้อมูลของคุณจะไม่ทำให้คุณประหลาดใจเมื่อถึงขีดจำกัดอย่างกะทันหัน
สรุป:หลีกเลี่ยงการเพิ่มข้อมูลออกจากตารางฐานข้อมูล
ในโพสต์นี้ เราได้ดูว่าคุณจะมองเห็นการเติบโตของฐานข้อมูลของคุณได้อย่างไร และทำให้ข้อมูลของคุณขยายตัวน้อยลง
การขยายตัวของข้อมูลถือเป็นความเสี่ยงที่แท้จริงสำหรับแอปพลิเคชันที่ประสบความสำเร็จในตลาด ด้วยการตั้งค่าตัววัดสำหรับตารางฐานข้อมูลของคุณ คุณสามารถคาดการณ์ได้ดีขึ้นว่าจะปรับขนาดฐานข้อมูลในแนวตั้งเมื่อใด และคุณจำเป็นต้องติดตั้งการล้างข้อมูลเก่าเป็นประจำหรือไม่ มาตรวัด AppSignal พร้อมแท็ก รวมกับ SQL เพียงเล็กน้อย จะทำให้คุณได้รับข้อมูลนี้ในรูปแบบที่สะดวกและน่าพึงพอใจ
อย่าปล่อยให้ฐานข้อมูลของคุณทำให้คุณประหลาดใจ!
จูลิค ทาร์คานอฟ
ผู้เขียนรับเชิญ Julik Tarkhanov เป็นวิศวกรซอฟต์แวร์พนักงานที่ Cheddar Payments และเป็นผู้เขียนไลบรารีโอเพ่นซอร์ส Ruby หลายแห่ง
บทความทั้งหมดโดย Julik Tarkhanov