การสแกนตามลำดับเทียบกับการสแกนด้วยดัชนี
เรียนรู้ว่าเมื่อใดการสแกนตามลำดับเหมาะสม เมื่อใดจำเป็นต้องใช้การสแกนด้วยดัชนี และตัววางแผนตัดสินใจอย่างไร
การสแกนตามลำดับเทียบกับการสแกนด้วยดัชนี เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การอ่าน EXPLAIN และ EXPLAIN ANALYZE
- การสแกนตามลำดับเทียบกับการสแกนด้วยดัชนี
- การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน
- การระบุและแก้ไขคำสั่งค้นหาที่ทำงานช้า