Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การเรียนรู้ประสิทธิภาพของฐานข้อมูล Ruby on Rails:กลยุทธ์การทดสอบและการเพิ่มประสิทธิภาพ

ในบทความนี้ คุณจะได้เรียนรู้วิธีทดสอบประสิทธิภาพของฐานข้อมูลใน 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. วัดตัวชี้วัดฐานข้อมูลที่สำคัญ

เวลาสืบค้นไม่ใช่ตัวชี้วัดเดียวในการวัดเพื่อดูว่าการสืบค้นมีประสิทธิภาพหรือไม่ — ดูที่ตัวชี้วัดฐานข้อมูลอื่นๆ หลายประการ รวมถึง:

  1. การใช้งานซีพียู
  2. การใช้หน่วยความจำ
  3. คิวดิสก์สำหรับการรอ IO
  4. แบนด์วิธเครือข่ายสำหรับการรับส่งข้อมูลขาเข้าและขาออก
  5. พื้นที่ว่างในดิสก์
  6. ปริมาณงาน

ข้อความค้นหาอาจช้าลงเมื่อเมตริกเหล่านี้เกินเกณฑ์ที่กำหนด คุณต้องดูจุดข้อมูลในช่วงเวลาหนึ่งเพื่อทำความเข้าใจปัญหาด้านประสิทธิภาพ

จุดข้อมูลที่จำเป็นต้องวัดขึ้นอยู่กับปัจจัยหลายอย่าง เช่น:

  • ประเภทฐานข้อมูล:

    • เชิงสัมพันธ์
    • ในหน่วยความจำ
    • ไม่มี SQL
    • คลังข้อมูล
  • เซิร์ฟเวอร์โฮสต์อย่างไร:

    • ภายในองค์กร
    • บนคลาวด์

ไม่มีวิธีเดียวในการตรวจสอบตัววัดฐานข้อมูล ขึ้นอยู่กับปัจจัยที่แตกต่างกัน

3. วัดประสิทธิภาพของแอป Rails โดยใช้ AppSignal

การจัดการตัวชี้วัดประสิทธิภาพทั้งหมดของคุณอาจเป็นเรื่องยากหากไม่มีศูนย์กลางที่ช่วยให้คุณมองเห็นคำค้นหาทั้งหมดได้ การเพิ่มโค้ดประสิทธิภาพให้กับทุกบล็อคโค้ดอาจเป็นเรื่องยุ่งยากและไม่สามารถจัดการได้

ด้วยเครื่องมืออย่าง AppSignal คุณสามารถรวมการวัดประสิทธิภาพเข้ากับแอปพลิเคชันของคุณได้อย่างง่ายดาย AppSignal รองรับ Rails ทันที เรียนรู้เกี่ยวกับกระบวนการติดตั้ง AppSignal อย่างง่ายจากเอกสาร 'AppSignal for Ruby'

ตัวชี้วัดที่สำคัญบางประการที่ต้องจับตาดูคือ:

  • การค้นหาช้า
  • ประสิทธิภาพของฐานข้อมูลตามปริมาณงาน
  • N+1 ข้อความค้นหา
  • เวลาแฝงของฐานข้อมูล
  • จำนวนการเชื่อมต่อที่ใช้งานอยู่

แดชบอร์ด AppSignal อาจมีลักษณะดังนี้:

การเรียนรู้ประสิทธิภาพของฐานข้อมูล Ruby on Rails:กลยุทธ์การทดสอบและการเพิ่มประสิทธิภาพ

7 วิธีในการเพิ่มประสิทธิภาพฐานข้อมูล Ruby on Rails

1. กำลังโหลดคำถาม N+1 อย่างกระตือรือร้น

แบบสอบถาม N+1 เป็นปัญหาประสิทธิภาพฐานข้อมูลที่พบบ่อยที่สุด ให้เราดูตัวอย่างของ 149 แบบสอบถามที่คุณมีสองรุ่น — ผู้ใช้และโครงการ:

 

ตอนนี้ ถ้าคุณต้องการค้นหาชื่อผู้ใช้และชื่อโครงการ ให้รันโค้ดต่อไปนี้:

 

โค้ดด้านบนจะสอบถามฐานข้อมูลในแต่ละลูปและทำให้เกิดปัญหาด้านประสิทธิภาพ จำนวนคำค้นหาทั้งหมดที่ดำเนินการจะเป็นจำนวนผู้ใช้ + 1

การกำจัดปัญหานี้ทำได้ง่ายมาก:กระตือรือร้นที่จะโหลดการเชื่อมโยง เพียงเพิ่ม 151 ที่ส่วนท้ายของแบบสอบถาม:

 

ตอนนี้ การดำเนินการวนซ้ำจะไม่สืบค้นฐานข้อมูล เนื่องจากการสืบค้นข้างต้นกระตือรือร้นที่จะโหลดโปรเจ็กต์:

 

Rails 6.1 ให้การโหลดที่เข้มงวดเพื่อให้แน่ใจว่าการเชื่อมโยงนั้นถูกโหลดอย่างกระตือรือร้นก่อนที่จะเข้าถึง หากต้องการเปิดใช้งานการโหลดแบบเข้มงวด ให้เพิ่มบรรทัดต่อไปนี้ในโมเดล:

 

ตอนนี้ เมื่อคุณพยายามเข้าถึงโปรเจ็กต์โดยไม่ต้องโหลด Rails จะส่ง 160 ข้อยกเว้น

หากคุณไม่มี Rails 6.1 คุณสามารถใช้อัญมณีอย่าง Bullet ได้

2. ใช้ดัชนีฐานข้อมูล

ฐานข้อมูลจัดทำดัชนีเพื่อช่วยดึงข้อมูลเร็วขึ้น การใช้คำสั่งอธิบายที่เรากล่าวถึงก่อนหน้านี้ คุณจะสามารถทราบได้ว่าแบบสอบถามใช้ดัชนีที่เหมาะสมหรือไม่

คุณสามารถเปลี่ยนการสืบค้นที่ช้าเพื่อใช้ดัชนีที่มีอยู่แล้วหรือดัชนีที่เพิ่มเข้ามาซึ่งจะช่วยปรับปรุงประสิทธิภาพได้

มีดัชนีที่แตกต่างกันสี่ประเภทใน MySQL:

  1. คีย์หลัก - ดัชนีจะถูกเพิ่มลงในคีย์หลักโดยอัตโนมัติ ซึ่งทำให้แน่ใจได้ว่าคีย์จะไม่ซ้ำกัน
  2. ไม่ซ้ำกัน - ดัชนีคีย์ที่ไม่ซ้ำช่วยให้แน่ใจว่ารายการที่เพิ่มในแอตทริบิวต์จะไม่ซ้ำกันเสมอ
  3. ดัชนี - เพิ่มไปยังแอตทริบิวต์อื่นที่ไม่ใช่คีย์หลัก
  4. ข้อความฉบับเต็ม - ช่วยในการสืบค้นข้อมูลแบบอักขระ

ดัชนีจะถูกจัดเก็บในรูปแบบ 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 ของเราและไม่พลาดแม้แต่โพสต์เดียว!