Flask Academy · บทเรียน

การรวมข้อมูลและการโหลดแบบช้ากับแบบเร็ว

หลีกเลี่ยงคำค้น N+1 ขณะสำรวจความสัมพันธ์

บทเรียน 4 จาก 413 ขั้นตอน

การรวมข้อมูลและการโหลดแบบช้ากับแบบเร็ว เป็นบทเรียน Flask Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Flask Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Flask Academy มีบทเรียนทั้งหมด 4 บทเรียน

ค้นหาข้ามตาราง

บางครั้งคุณต้องกรองตารางแม่โดยใช้ข้อมูลของตารางลูก join ช่วยให้คำค้นหาเดียวทำงานครอบคลุมตารางที่เกี่ยวข้องกันสองตารางได้พร้อมกัน 🔀

เขียน join

เรียก join() บนคำค้นหาเพื่อดึงแบบจำลองที่เกี่ยวข้องเข้ามา จากนั้นกรองข้อมูลจากฝั่งใดฝั่งหนึ่งได้ในคำค้นหารวมเดียว

q = User.query.join(Post).filter(Post.title == "Hi")

กรองบนตารางที่ join แล้ว

หลังจากทำ join แล้ว คุณสามารถใช้เงื่อนไขกับแบบจำลองอีกฝั่งได้ จึงค้นหาตารางแม่จากข้อมูลที่ตารางลูกมีอยู่ได้

active = User.query.join(Post).filter(Post.public).all()

การโหลดแบบขี้เกียจเป็นค่าเริ่มต้น

โดยค่าเริ่มต้น relationship จะโหลดแบบ lazy กล่าวคือข้อมูลลูกจะถูกโหลดเมื่อคุณเข้าถึงแอตทริบิวต์นั้นจริง ๆ เท่านั้น

user = User.query.first()
user.posts

ปัญหา N+1

การวนซ้ำตารางแม่และอ่านข้อมูลลูกแบบ lazy จะส่งคำค้นหาหนึ่งครั้งต่อตารางแม่หนึ่งรายการ รูปแบบ N+1 นี้ทำให้ประสิทธิภาพแย่ลงอย่างเงียบ ๆ 😬

for u in User.query.all():
    print(len(u.posts))

การโหลดล่วงหน้าช่วยแก้ปัญหา

eager loading จะดึงแถวที่เกี่ยวข้องมาไว้ล่วงหน้า ทำให้โหลดกราฟข้อมูลทั้งหมดได้ด้วยคำค้นหาเพียงหนึ่งหรือสองครั้ง

joinedload ในคำค้นหาเดียว

ใช้ joinedload เพื่อดึงตารางแม่และตารางลูกมาพร้อมกันด้วย SQL join เดียว

from sqlalchemy.orm import joinedload
User.query.options(joinedload(User.posts)).all()

selectinload สำหรับกลุ่มข้อมูล

selectinload จะโหลดข้อมูลลูกด้วยคำค้นหาแบบรวมชุดเป็นครั้งที่สอง ซึ่งมักรองรับรายการแบบหนึ่งต่อหลายได้ดีกว่า

from sqlalchemy.orm import selectinload
User.query.options(selectinload(User.posts)).all()

กำหนดกลยุทธ์ในแบบจำลอง

คุณยังเลือกค่าเริ่มต้นได้ด้วยตัวเลือก lazy ของ relationship เช่น select, joined หรือ selectin

posts = db.relationship("Post", lazy="selectin")

join ไม่ได้โหลดล่วงหน้า

join แบบปกติใช้กรองข้อมูลข้ามตาราง แต่ไม่ได้โหลด relationship ไว้ล่วงหน้า หากต้องการเช่นนั้น คุณยังต้องเพิ่มตัวเลือกการโหลดล่วงหน้า

เลือกวิธีโหลดอย่างเหมาะสม

Lazy เหมาะสำหรับแถวเดียว แต่ควรใช้ eager loading เมื่อคุณวนซ้ำตารางแม่หลายรายการและอ่านข้อมูลลูกของแต่ละรายการ

ตรวจสอบอย่างรวดเร็ว

คุณวนซ้ำผู้ใช้ 100 คนและอ่านโพสต์ของผู้ใช้แต่ละคน การโหลดแบบ lazy อาจทำให้เกิดปัญหาใด

สรุป: Join และการโหลดข้อมูล

ตอนนี้คุณสามารถ join ตาราง ตรวจพบปัญหา N+1 และแก้ไขด้วย joinedload หรือ selectinload ได้แล้ว การอ่านข้อมูลเชิงสัมพันธ์อย่างมีประสิทธิภาพเสร็จเรียบร้อย 🏁

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “การรวมข้อมูลและการโหลดแบบช้ากับแบบเร็ว” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การรวมข้อมูลและการโหลดแบบช้ากับแบบเร็ว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Flask Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Flask Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การรวมข้อมูลและการโหลดแบบช้ากับแบบเร็ว”

หลีกเลี่ยงคำค้น N+1 ขณะสำรวจความสัมพันธ์ คุณปฏิบัติ Flask Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Flask Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Flask Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การรวมข้อมูลและการโหลดแบบช้ากับแบบเร็ว” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Flask Academy นี้ได้ไหม

ได้ บทเรียน Flask Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ดึงแถวด้วย query และ get
  2. กรอง เรียงลำดับ และจำกัดผลลัพธ์
  3. กำหนดความสัมพันธ์และคีย์ต่างประเทศ
  4. การรวมข้อมูลและการโหลดแบบช้ากับแบบเร็ว
← กลับไปที่ Flask Academy