ดัชนีแบบผสมและลำดับคอลัมน์
เลือกลำดับคอลัมน์สำหรับดัชนีแบบผสม ทำความเข้าใจกฎคำนำหน้าด้านซ้าย และออกแบบดัชนีที่รองรับคำสั่งค้นหาหลายแบบ
ดัชนีแบบผสมและลำดับคอลัมน์ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ดัชนีผสมคืออะไร
ดัชนีที่มีมากกว่าหนึ่งคอลัมน์ B-tree ของ PostgreSQL สร้างดัชนีได้สูงสุด 32 คอลัมน์ แต่โดยทั่วไปมักใช้ 2–4 คอลัมน์
CREATE INDEX orders_user_created_idx ON orders(user_id, created_at DESC);เหตุผลที่ใช้ดัชนีผสม
มีสองกรณี:
- คำสั่งค้นหาคัดกรองด้วยหลายคอลัมน์พร้อมกัน
- คำสั่งค้นหาคัดกรองด้วยคอลัมน์หนึ่งและเรียงลำดับด้วยอีกคอลัมน์หนึ่ง
กฎคำนำหน้าด้านซ้าย
ดัชนีบน (a, b, c) รองรับ:
WHERE a = ?WHERE a = ? AND b = ?WHERE a = ? AND b = ? AND c = ?
ดัชนีนี้ NOT รองรับ WHERE b = ? เพียงอย่างเดียว และไม่รองรับ WHERE c = ?
ลำดับมีความสำคัญ
วางคอลัมน์ที่มีความจำเพาะสูงที่สุด AND ถูกใช้เป็นตัวกรองบ่อยที่สุดไว้ก่อน คอลัมน์ที่ใช้เปรียบเทียบความเท่ากันควรมาก่อนคอลัมน์ที่ใช้เปรียบเทียบช่วง:
CREATE INDEX orders_user_total_idx ON orders(user_id, total);
-- Best for: WHERE user_id = 42 AND total > 100
-- Also OK: WHERE user_id = 42
-- Useless: WHERE total > 100 (without user_id)ความเท่ากันเทียบกับช่วง
เงื่อนไขเปรียบเทียบความเท่ากันใช้ดัชนีได้อย่างมีประสิทธิภาพ ส่วนเงื่อนไขช่วงก็ใช้ดัชนีได้แต่จำกัดประโยชน์ในการใช้คอลัมน์ถัดไป ควรวางคอลัมน์ที่ใช้เปรียบเทียบความเท่ากันไว้ก่อน:
-- Index: (status, created_at)
WHERE status = 'paid' AND created_at >= ... -- both columns used
WHERE created_at >= ... AND status = 'paid' -- index used for status, range scan on created_atลำดับดัชนี = ลำดับการเรียง
ดัชนีบน (user_id, created_at DESC) รองรับคำสั่ง "คำสั่งซื้อของผู้ใช้ เรียงจากใหม่ไปเก่า" โดยไม่ต้องมีขั้นตอนเรียงลำดับ:
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE user_id = 42
ORDER BY created_at DESC LIMIT 10;
-- Index Scan, no Sort node neededการรวมคอลัมน์ที่ไม่ใช่คีย์ (INCLUDE)
PG 11+ รองรับ INCLUDE สำหรับดัชนีแบบ "ครอบคลุม" — คอลัมน์เพิ่มเติมจะถูกเก็บไว้ที่โหนดปลายสุด แต่ไม่ใช้สำหรับการเรียงลำดับ:
CREATE INDEX orders_user_idx ON orders(user_id)
INCLUDE (total, status);
-- Enables Index-Only Scan for queries that need just these columns.เมื่อไม่ควรสร้างดัชนีผสม
หากมีการเรียกใช้คอลัมน์แยกจากกัน ดัชนีแบบคอลัมน์เดียวสองรายการอาจรองรับคำสั่งค้นหาได้มากกว่า ดัชนีผสมแลกความยืดหยุ่นกับการทำให้ "คำสั่งค้นหาหนึ่งรายการมีทุกอย่างพร้อมใช้"
การรวมดัชนีแบบบิตแมป
PostgreSQL สามารถรวมดัชนีคอลัมน์เดี่ยวหลายรายการผ่านการสแกนดัชนีแบบบิตแมปได้:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
-- BitmapAnd of two index scans — works without a composite, but slower than the right composite.เฝ้าระวังความบวมของดัชนี
ดัชนีแบบผสมมีขนาดกว้างกว่า ดัชนีที่กว้างขึ้น = ไฟล์ที่ใหญ่ขึ้น = ดัชนีมีส่วนน้อยลงที่พอดีกับแคช ควรเลือกใช้อย่างรอบคอบ
การเลือกลำดับคอลัมน์ — ตัวอย่างการใช้งานจริง
แบบสอบถาม: รายการสั่งซื้อของผู้ใช้หนึ่งรายในช่วงวันที่ที่กำหนด โดยเรียงตามวันที่
-- Index design:
CREATE INDEX orders_user_created_idx
ON orders(user_id, created_at DESC);
-- Query (efficiently uses the index):
SELECT * FROM orders
WHERE user_id = 42
AND created_at >= NOW() - INTERVAL '30 days'
ORDER BY created_at DESC LIMIT 10;สรุป
ดัชนีแบบผสมรองรับตัวกรองหลายคอลัมน์และช่วยหลีกเลี่ยงขั้นตอนการเรียงลำดับ
- กฎคำนำหน้าด้านซ้ายสุด
- คอลัมน์ที่ใช้ตรวจสอบความเท่ากันมาก่อน
- ใช้ INCLUDE สำหรับคอลัมน์ที่มีไว้เพื่อให้ข้อมูลครบถ้วนในการค้นหาเท่านั้น
- ดัชนีเดี่ยวสองรายการเทียบกับดัชนีแบบผสมหนึ่งรายการ — ขึ้นอยู่กับชุดของแบบสอบถาม
ตรวจสอบความเข้าใจอย่างรวดเร็ว
คุณมีดัชนีบน (user_id, status, created_at) แบบสอบถามใดที่ไม่สามารถใช้ดัชนีนี้ได้อย่างมีประสิทธิภาพ
คำถามที่พบบ่อย
บทเรียน “ดัชนีแบบผสมและลำดับคอลัมน์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ดัชนีแบบผสมและลำดับคอลัมน์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ดัชนี B-tree เทียบกับ Hash เทียบกับ GiST เทียบกับ GIN
- ดัชนีแบบผสมและลำดับคอลัมน์
- ดัชนีบางส่วนและดัชนีนิพจน์
- การดูแลรักษาดัชนีและข้อมูลบวม