ในบทความนี้ คุณจะได้เรียนรู้วิธีทดสอบประสิทธิภาพของฐานข้อมูลใน Rails และแก้ไขปัญหาประสิทธิภาพฐานข้อมูลที่พบบ่อยที่สุด
เมื่อคุณพัฒนาแอปพลิเคชัน Rails ActiveRecord จะเป็นเครื่องมือเริ่มต้นที่จัดการฐานข้อมูลของคุณ ActiveRecord มีอินเทอร์เฟซที่ง่ายและรวดเร็วในการสืบค้นและแทรกข้อมูลโดยใช้คำสั่งเช่น 01 , 10รหัส> , 24รหัส> และ 33รหัส> . Rails ทำหน้าที่แปลงคำสั่งเหล่านี้เป็นคำสั่ง SQL ซึ่งเป็นสิ่งที่ดี แต่บางครั้งอาจทำให้เกิดปัญหาด้านประสิทธิภาพได้ สิ่งสำคัญคือคุณต้องเข้าใจปัญหาทั่วไปบางประการและวิธีเพิ่มประสิทธิภาพ
บันทึกย่อเกี่ยวกับ ActiveRecord ใน Ruby on Rails
Rails ActiveRecord เป็นเลเยอร์ใน Model-View-Controller (MVC) ที่จัดการฐานข้อมูลของคุณโดยการแสดงเป็นออบเจ็กต์ทางธุรกิจ รูปแบบ ActiveRecord ใช้เทคนิค ORM เพื่อเชื่อมต่อออบเจ็กต์ของแอปพลิเคชันกับระบบการจัดการตารางฐานข้อมูลเชิงสัมพันธ์
เอาล่ะ เริ่มกันเลย!
3 วิธีในการระบุและทดสอบปัญหาประสิทธิภาพของฐานข้อมูลใน Rails
1. เรียกใช้ Explain บนแบบสอบถาม ActiveRecord
คำสั่งอธิบายจะแสดงข้อมูลเกี่ยวกับแผนการดำเนินการของการสืบค้น SQL - วิธีดำเนินการสืบค้น รวมถึงจำนวนแถวที่จะถูกสแกน ดัชนีใดที่จะใช้ และวิธีรวมตาราง
แผนการดำเนินการช่วยให้เราทราบว่าอะไรที่ทำให้การดำเนินการค้นหาช้าลงโดยดูที่:
- ดัชนีใดที่คุณควรเพิ่มเพื่อปรับปรุงประสิทธิภาพของแบบสอบถาม
- หากตารางถูกรวมเข้าด้วยกันในลำดับที่เหมาะสมที่สุด คุณสามารถใช้
48เพื่อบังคับลำดับตารางในคำสั่ง join เพื่อประสิทธิภาพที่ดีขึ้น
อธิบายการทำงานกับคำสั่ง SELECT, DELETE, INSERT, REPLACE และ UPDATE เช่นกัน
การใช้อธิบายกับ ActiveRecord นั้นตรงไปตรงมามาก ป้อนข้อมูลต่อไปนี้:
กำลังเพิ่ม 52 ที่ส่วนท้ายของคำสั่งจัดเตรียมแผนการสืบค้นสำหรับคำสั่ง ActiveRecord ตัวอย่างข้างต้นเป็นแบบสอบถามง่ายๆ ที่ใช้ 67 (คีย์หลัก) เพื่อสอบถามตาราง ผลลัพธ์ของ 78 คำสั่งแสดงว่ากำลังใช้ 87 . จากนี้ คุณสามารถมั่นใจได้ว่าข้อความนั้นเหมาะสมและรวดเร็ว
คุณสามารถลองเพิ่ม 99 คำสั่งสำหรับการสืบค้นที่ช้าของคุณเพื่อค้นหาลำดับการดำเนินการพร้อมกับดัชนีที่ใช้ หากแผนการสืบค้นแสดง 100 ดัชนีไม่ได้ใช้และจำเป็นต้องเปลี่ยนแบบสอบถามหรือเพิ่มดัชนีใหม่
นี่เป็นอีกตัวอย่างหนึ่งที่มีการเข้าร่วม:
ที่นี่ ตารางผู้ใช้จะเข้าร่วมกับตารางการทำงานร่วมกัน เมื่อคุณดูแผนแบบสอบถาม ตารางการทำงานร่วมกันจะใช้ 113 และดำเนินการก่อน — ในขณะที่ตารางผู้ใช้ใช้ 127 จัดทำดัชนีและดำเนินการในภายหลัง คุณสามารถเพิ่มดัชนีใน 137 ในตารางการทำงานร่วมกันเพื่อเพิ่มประสิทธิภาพการค้นหานี้ อธิบายความช่วยเหลือในการแจกแจงคำถาม เพื่อให้คุณสามารถทราบได้ว่าจุดใดที่จำเป็นต้องเพิ่มประสิทธิภาพ
2. วัดตัวชี้วัดฐานข้อมูลที่สำคัญ
เวลาสืบค้นไม่ใช่ตัวชี้วัดเดียวในการวัดเพื่อดูว่าการสืบค้นมีประสิทธิภาพหรือไม่ — ดูที่ตัวชี้วัดฐานข้อมูลอื่นๆ หลายประการ รวมถึง:
- การใช้งานซีพียู
- การใช้หน่วยความจำ
- คิวดิสก์สำหรับการรอ IO
- แบนด์วิธเครือข่ายสำหรับการรับส่งข้อมูลขาเข้าและขาออก
- พื้นที่ว่างในดิสก์
- ปริมาณงาน
ข้อความค้นหาอาจช้าลงเมื่อเมตริกเหล่านี้เกินเกณฑ์ที่กำหนด คุณต้องดูจุดข้อมูลในช่วงเวลาหนึ่งเพื่อทำความเข้าใจปัญหาด้านประสิทธิภาพ
จุดข้อมูลที่จำเป็นต้องวัดขึ้นอยู่กับปัจจัยหลายอย่าง เช่น:
-
ประเภทฐานข้อมูล:
- เชิงสัมพันธ์
- ในหน่วยความจำ
- ไม่มี SQL
- คลังข้อมูล
-
เซิร์ฟเวอร์โฮสต์อย่างไร:
- ภายในองค์กร
- บนคลาวด์
ไม่มีวิธีเดียวในการตรวจสอบตัววัดฐานข้อมูล ขึ้นอยู่กับปัจจัยที่แตกต่างกัน
3. วัดประสิทธิภาพของแอป Rails โดยใช้ AppSignal
การจัดการตัวชี้วัดประสิทธิภาพทั้งหมดของคุณอาจเป็นเรื่องยากหากไม่มีศูนย์กลางที่ช่วยให้คุณมองเห็นคำค้นหาทั้งหมดได้ การเพิ่มโค้ดประสิทธิภาพให้กับทุกบล็อคโค้ดอาจเป็นเรื่องยุ่งยากและไม่สามารถจัดการได้
ด้วยเครื่องมืออย่าง AppSignal คุณสามารถรวมการวัดประสิทธิภาพเข้ากับแอปพลิเคชันของคุณได้อย่างง่ายดาย AppSignal รองรับ Rails ทันที เรียนรู้เกี่ยวกับกระบวนการติดตั้ง AppSignal อย่างง่ายจากเอกสาร 'AppSignal for Ruby'
ตัวชี้วัดที่สำคัญบางประการที่ต้องจับตาดูคือ:
- การค้นหาช้า
- ประสิทธิภาพของฐานข้อมูลตามปริมาณงาน
- N+1 ข้อความค้นหา
- เวลาแฝงของฐานข้อมูล
- จำนวนการเชื่อมต่อที่ใช้งานอยู่
แดชบอร์ด AppSignal อาจมีลักษณะดังนี้:

7 วิธีในการเพิ่มประสิทธิภาพฐานข้อมูล Ruby on Rails
1. กำลังโหลดคำถาม N+1 อย่างกระตือรือร้น
แบบสอบถาม N+1 เป็นปัญหาประสิทธิภาพฐานข้อมูลที่พบบ่อยที่สุด ให้เราดูตัวอย่างของ 149 แบบสอบถามที่คุณมีสองรุ่น — ผู้ใช้และโครงการ:
ตอนนี้ ถ้าคุณต้องการค้นหาชื่อผู้ใช้และชื่อโครงการ ให้รันโค้ดต่อไปนี้:
โค้ดด้านบนจะสอบถามฐานข้อมูลในแต่ละลูปและทำให้เกิดปัญหาด้านประสิทธิภาพ จำนวนคำค้นหาทั้งหมดที่ดำเนินการจะเป็นจำนวนผู้ใช้ + 1
การกำจัดปัญหานี้ทำได้ง่ายมาก:กระตือรือร้นที่จะโหลดการเชื่อมโยง เพียงเพิ่ม 151 ที่ส่วนท้ายของแบบสอบถาม:
ตอนนี้ การดำเนินการวนซ้ำจะไม่สืบค้นฐานข้อมูล เนื่องจากการสืบค้นข้างต้นกระตือรือร้นที่จะโหลดโปรเจ็กต์:
Rails 6.1 ให้การโหลดที่เข้มงวดเพื่อให้แน่ใจว่าการเชื่อมโยงนั้นถูกโหลดอย่างกระตือรือร้นก่อนที่จะเข้าถึง หากต้องการเปิดใช้งานการโหลดแบบเข้มงวด ให้เพิ่มบรรทัดต่อไปนี้ในโมเดล:
ตอนนี้ เมื่อคุณพยายามเข้าถึงโปรเจ็กต์โดยไม่ต้องโหลด Rails จะส่ง 160 ข้อยกเว้น
หากคุณไม่มี Rails 6.1 คุณสามารถใช้อัญมณีอย่าง Bullet ได้
2. ใช้ดัชนีฐานข้อมูล
ฐานข้อมูลจัดทำดัชนีเพื่อช่วยดึงข้อมูลเร็วขึ้น การใช้คำสั่งอธิบายที่เรากล่าวถึงก่อนหน้านี้ คุณจะสามารถทราบได้ว่าแบบสอบถามใช้ดัชนีที่เหมาะสมหรือไม่
คุณสามารถเปลี่ยนการสืบค้นที่ช้าเพื่อใช้ดัชนีที่มีอยู่แล้วหรือดัชนีที่เพิ่มเข้ามาซึ่งจะช่วยปรับปรุงประสิทธิภาพได้
มีดัชนีที่แตกต่างกันสี่ประเภทใน MySQL:
- คีย์หลัก - ดัชนีจะถูกเพิ่มลงในคีย์หลักโดยอัตโนมัติ ซึ่งทำให้แน่ใจได้ว่าคีย์จะไม่ซ้ำกัน
- ไม่ซ้ำกัน - ดัชนีคีย์ที่ไม่ซ้ำช่วยให้แน่ใจว่ารายการที่เพิ่มในแอตทริบิวต์จะไม่ซ้ำกันเสมอ
- ดัชนี - เพิ่มไปยังแอตทริบิวต์อื่นที่ไม่ใช่คีย์หลัก
- ข้อความฉบับเต็ม - ช่วยในการสืบค้นข้อมูลแบบอักขระ
ดัชนีจะถูกจัดเก็บในรูปแบบ B-Tree หรือ Hash
คุณสามารถเพิ่มดัชนีลงในฟิลด์เดียวหรือสร้างเป็นองค์ประกอบของหลายฟิลด์ได้ ดัชนีผสมมีประโยชน์ในการเพิ่มประสิทธิภาพการสืบค้นที่มีหลายช่อง เมื่อใช้เพียงดัชนีเดียว จำเป็นต้องมีการสแกนชุดข้อมูลขนาดใหญ่
ตัวอย่างเช่น ในแบบสอบถามต่อไปนี้ มีสองฟิลด์:
อาจมีผู้ใช้จำนวนมากในโครงการ 175 และช่องประเทศจะถูกสแกน นี่อาจเป็นกระบวนการที่ช้าเนื่องจากมีชุดข้อมูลผลลัพธ์ขนาดใหญ่ ในกรณีนี้ คุณสามารถเพิ่มดัชนีคอมโพสิตลงในช่องโครงการและประเทศเพื่อปรับปรุงประสิทธิภาพได้
คุณสามารถเพิ่มดัชนีลงใน Rails ด้วยคำสั่งการย้าย ActiveRecord ต่อไปนี้:
ดัชนีเดี่ยว:
ดัชนีคอมโพสิต:
3. ใช้ขีดจำกัด
ยิ่งมีการส่งคืนเรกคอร์ดมากเท่าใด ประสิทธิภาพก็จะช้าลงเท่านั้น เป็นการดีกว่าถ้าทำหลายแบบสอบถามมากกว่าแบบสอบถามเดียวที่ส่งคืนชุดข้อมูลขนาดใหญ่
หากต้องการดึงข้อมูล 100 ชุดถัดไป คุณสามารถใช้ออฟเซ็ต:
สิ่งนี้จะช่วยปรับปรุงประสิทธิภาพได้อย่างมาก สิ่งหนึ่งที่ควรจำไว้ก็คือ เมื่อมีออฟเซ็ตที่สูงกว่า การสืบค้นก็จะช้าลง เพิ่มขีดจำกัดให้กับออฟเซ็ต
4. ใช้ 188 หากต้องการโหลดรายการจำนวนมาก
เมื่อวนซ้ำบันทึก ให้จัดกลุ่มบันทึกใน Rails เพื่อประสิทธิภาพที่ดีขึ้น:
การดำเนินการนี้จะสอบถามบันทึกทั้งหมดในฐานข้อมูลเพียงครั้งเดียว และทำให้เกิดปัญหาประสิทธิภาพของหน่วยความจำและฐานข้อมูล
ใช้ 192 หรือ 206รหัส> จะช่วยปรับปรุงประสิทธิภาพโดยดำเนินการเดียวกันในชุด:
ตามค่าเริ่มต้น 210 ข้อความค้นหาส่งผลให้มีชุดข้อมูล 1,000 รายการ คุณสามารถเปลี่ยนขนาดแบตช์ได้โดยกำหนดเป็นอาร์กิวเมนต์:
คุณยังสามารถใช้ 228 ได้ ขึ้นอยู่กับการดำเนินการที่คุณต้องดำเนินการ ความแตกต่างระหว่าง 236 และ 243รหัส> นั่นคือ 254 ให้ผลลัพธ์เป็นอาร์เรย์ของโมเดลแทนที่จะเป็นแต่ละเรคคอร์ด
5. เลือกฟิลด์ที่คุณต้องการโดยใช้ Pluck
คำสั่ง Pluck จะแปลงผลลัพธ์ของการสืบค้นเป็นอาร์เรย์โดยตรงแทนที่จะเป็นวัตถุ ActiveRecord
หากแบบสอบถามส่งกลับผลลัพธ์จำนวนมาก การใช้ Pluck จะช่วยปรับปรุงประสิทธิภาพของโค้ด Pluck จะเลือกเฉพาะฟิลด์ที่ต้องการจากฐานข้อมูล:
ผลลัพธ์จะถูกดึงมาจากดัชนี ไม่ใช่ตารางหลัก และมีประสิทธิภาพมากกว่ากับข้อความค้นหาที่เกี่ยวข้องกับการเรียงลำดับ
6. ใช้การดำเนินการเป็นกลุ่ม
ลบเป็นกลุ่ม การดำเนินการลบที่วนซ้ำบนวัตถุ ActiveRecord จะลบบันทึกทีละรายการ:
การลบแต่ละระเบียนจำเป็นต้องมีการสืบค้นข้อมูลจำนวนมากในฐานข้อมูล วิธีที่ดีที่สุดคือใช้ 264 กลุ่มเดียวแทน สอบถาม:
สร้างจำนวนมาก บางคนไม่ทราบว่าคล้ายกับการลบจำนวนมาก แต่คุณสามารถแทรกจำนวนมากด้วย ActiveRecord ได้เช่นกัน ซึ่งสามารถลด 274 ได้ จำนวนข้อความค้นหาเพียงหนึ่งเดียว 285รหัส> 292รหัส> วิธีการยอมรับอาร์เรย์ของแฮชเป็นอินพุต:
7. ใช้การคำนวณในหน่วยความจำหากจำเป็น
ในบางกรณี การคำนวณในหน่วยความจำจะดีกว่าการสืบค้น สมมติว่าเราต้องการค้นหาประเทศในฐานข้อมูลของเราที่ไม่มีบันทึกผู้ใช้:
แบบสอบถามข้างต้นจำเป็นต้องมี N แบบสอบถามเพื่อให้ได้ผลลัพธ์ แทนที่จะทำเช่นนี้ เราสามารถเขียนคำค้นหาเดียวเพื่อค้นหาผู้ใช้ในประเทศที่ระบุ และทำการคำนวณอื่นๆ ในหน่วยความจำ:
คุณสามารถแคชเพื่อใช้วงจรการตอบกลับคำขอซ้ำและลดภาระของฐานข้อมูลได้ในบางกรณี Rails มีเทคนิคการแคชสามประเภท:เพจ การดำเนินการ และการแคชแฟรกเมนต์ (การแคชแฟรกเมนต์มีให้ตามค่าเริ่มต้น)
สรุป:เพิ่มประสิทธิภาพ Ruby on Rails ของคุณด้วย ActiveRecord และ AppSignal
เอาล่ะ ถึงเวลาสรุปแล้ว! ในโพสต์นี้ เราได้กล่าวถึงสามวิธีในการระบุและทดสอบปัญหาประสิทธิภาพของฐานข้อมูลใน Rails โดย:
- การเรียกใช้ Explain บนคำสั่ง ActiveRecord
- การวัดตัวชี้วัดฐานข้อมูลที่สำคัญ
- การวัดประสิทธิภาพของแอป Rails โดยใช้ AppSignal
และเจ็ดวิธีในการเพิ่มประสิทธิภาพฐานข้อมูลของคุณ รวมถึงการใช้:
- กระตือรือร้นที่จะโหลดคำถาม N+1
- ดัชนีฐานข้อมูล
- ขีดจำกัด
301รหัส> เพื่อโหลดรายการจำนวนมาก- ถอนเพื่อเลือกฟิลด์ที่ต้องการ
- การดำเนินงานเป็นกลุ่ม
- การคำนวณในหน่วยความจำ
Rails ทำให้การพัฒนาแอปพลิเคชันเป็นเรื่องง่ายและรวดเร็วเป็นพิเศษ ActiveRecord ช่วยในเรื่องประสิทธิภาพการทำงาน การนำกลับมาใช้ใหม่ และการบำรุงรักษาโค้ดฐานข้อมูล การทำความเข้าใจว่าแบบสอบถาม ActiveRecord แปลเป็นแบบสอบถาม SQL และดำเนินการอย่างไรเป็นสิ่งสำคัญ
อย่างไรก็ตาม สิ่งที่สำคัญที่สุดที่คุณต้องเพิ่มประสิทธิภาพฐานข้อมูล Rails ของคุณคือการมองเห็นข้อมูลประสิทธิภาพ ปัญหาด้านประสิทธิภาพเป็นเรื่องปกติ แต่คุณสามารถแก้ไขได้เมื่อคุณมองเห็นสิ่งนี้แล้ว คุณต้องมีเครื่องมือตรวจสอบที่เหมาะสมซึ่งมีการวัดฐานข้อมูล เราชอบ AppSignal;)
ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว! ป>