SQL Academy · บทเรียน

การสแกนตามลำดับเทียบกับการสแกนด้วยดัชนี

เรียนรู้ว่าเมื่อใดการสแกนตามลำดับเหมาะสม เมื่อใดจำเป็นต้องใช้การสแกนด้วยดัชนี และตัววางแผนตัดสินใจอย่างไร

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

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

สองวิธีค้นหาแถว

ฐานข้อมูลมีกลยุทธ์พื้นฐานสองแบบสำหรับอ่านแถว:

  • การสแกนตามลำดับ — อ่านทุกหน้าของตาราง
  • การสแกนดัชนี — ไล่ดูดัชนีแล้วดึงแถวที่ตรงกัน

เมื่อการสแกนตามลำดับเหมาะสม

หากต้องใช้ข้อมูลส่วนใหญ่ของตารางอยู่แล้ว การสแกนทั้งตารางจะถูกกว่าการอ่านดัชนีแล้วดึงแถวที่ตรงกันทีละแถว โดยคร่าว ๆ คือ หากเกินประมาณ 10–20% ของแถว → การสแกนตามลำดับมักได้เปรียบ

เมื่อการสแกนดัชนีได้เปรียบ

สำหรับคำสั่งค้นหาที่เลือกแถวได้จำเพาะเจาะจง (มีแถวเพียงส่วนน้อย) ดัชนีจะช่วยลดเวลาได้มาก:

EXPLAIN SELECT * FROM users WHERE id = 42;
-- Index Scan using users_pkey  (cost=0.43..8.45 rows=1)

EXPLAIN SELECT * FROM users WHERE active;
-- Seq Scan on users  (cost=0.00..15000.00 rows=950000)
-- (because most users are active)

การสแกนดัชนีเทียบกับการสแกนด้วยดัชนีเท่านั้น

บางครั้งดัชนีเพียงอย่างเดียวมีคอลัมน์ทั้งหมดที่ต้องใช้ จึงไม่จำเป็นต้องดึงข้อมูลจากตาราง การทำงานนี้เรียกว่า การสแกนด้วยดัชนีเท่านั้น:

CREATE INDEX users_email_id_idx ON users(id) INCLUDE (email);

EXPLAIN SELECT email FROM users WHERE id = 42;
-- Index Only Scan using users_email_id_idx

การสแกนดัชนีแบบบิตแมป

เมื่อความจำเพาะอยู่ระดับปานกลาง PostgreSQL อาจสร้างบิตแมปของแถวที่ตรงกัน แล้วดึงแถวเหล่านั้นตามลำดับทางกายภาพ ซึ่งเร็วกว่าการรับส่งข้อมูลแบบสุ่ม:

EXPLAIN SELECT * FROM orders WHERE status = 'pending';
-- Bitmap Heap Scan on orders
--   Recheck Cond: (status = 'pending')
--   -> Bitmap Index Scan on orders_status_idx

เหตุผลที่ตัววางแผนเลือกการสแกนตามลำดับ

สาเหตุที่พบบ่อย:

  • ไม่มีดัชนีบนคอลัมน์ที่ใช้คัดกรอง
  • ไม่สามารถใช้ดัชนีได้ (มีฟังก์ชันบนคอลัมน์ มีเงื่อนไข OR หรือชนิดข้อมูลไม่ตรงกัน)
  • จำนวนแถวที่คาดไว้สูงเกินกว่าที่การใช้ดัชนีจะคุ้มค่า
  • สถิติล้าสมัย ทำให้ตัววางแผนประเมินความจำเพาะผิด

บังคับใช้ดัชนี (อย่างระมัดระวัง)

คุณไม่สามารถระบุคำแนะนำให้ PostgreSQL โดยตรงได้ แต่ทำสิ่งต่อไปนี้ได้:

  • เรียกใช้ ANALYZE เพื่อปรับปรุงสถิติ
  • เพิ่มดัชนีที่เหมาะสม
  • ตั้งค่าระดับเซสชัน: SET enable_seqscan = off; เพื่อการวินิจฉัย (ไม่ควรใช้ในระบบจริง)

เงื่อนไขคัดกรองที่ใช้ดัชนีได้

เพื่อให้ดัชนีช่วยได้ เงื่อนไข WHERE ต้องเป็นแบบ "sargable" กล่าวคือเปรียบเทียบกับคอลัมน์ที่ทำดัชนีโดยตรง:

-- GOOD:
WHERE created_at >= '2024-01-01'

-- BAD (function on the column):
WHERE date_trunc('day', created_at) = '2024-01-01'

-- BAD (cast):
WHERE created_at::DATE = '2024-01-01'

-- FIX: add a functional index, or rewrite with range.

ลำดับของดัชนีผสม

ดัชนีบน (a, b) ช่วยคำสั่งค้นหาที่ใช้ a เพียงอย่างเดียวและคำสั่งที่ใช้ a AND b แต่ไม่ช่วยคำสั่งที่ใช้ b เพียงอย่างเดียว

ขนาดดัชนีมีความสำคัญ

ดัชนี B-tree แบบแคบที่มีคีย์ถูกใช้งานบ่อยอาจอยู่ในหน่วยความจำได้ทั้งหมด แต่ดัชนีแบบกว้างอาจทำไม่ได้ ดัชนีที่เล็กกว่าจะทำงานได้เร็วกว่า

ตรวจสอบแผนการทำงาน

หลังเพิ่มดัชนี ให้เรียกใช้ EXPLAIN ANALYZE เพื่อยืนยันว่าตัววางแผนใช้ดัชนีนั้นจริง หากไม่ใช้ ให้ตรวจสอบสาเหตุต่อไป

สรุป

การเลือกใช้การสแกนตามลำดับหรือการสแกนดัชนีขึ้นอยู่กับความจำเพาะ

  • ตัวกรองที่เลือกแถวได้จำเพาะ → การสแกนดัชนี
  • ข้อมูลส่วนใหญ่ของตาราง → การสแกนตามลำดับ
  • ข้อมูลระดับกลาง → การสแกนแบบบิตแมป
  • ตรวจสอบว่าเงื่อนไขคัดกรองใช้ดัชนีได้

ตรวจสอบความเข้าใจอย่างรวดเร็ว

เหตุใด PostgreSQL จึงอาจเลือกการสแกนตามลำดับแทนดัชนีที่มีอยู่

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

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

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

คอร์ส
46
บทเรียน
183

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

บทเรียน “การสแกนตามลำดับเทียบกับการสแกนด้วยดัชนี” ฟรีหรือไม่

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

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

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

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

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

บทเรียน “การสแกนตามลำดับเทียบกับการสแกนด้วยดัชนี” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การอ่าน EXPLAIN และ EXPLAIN ANALYZE
  2. การสแกนตามลำดับเทียบกับการสแกนด้วยดัชนี
  3. การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน
  4. การระบุและแก้ไขคำสั่งค้นหาที่ทำงานช้า
← กลับไปที่ SQL Academy