0Pricing
SQL Academy · บทเรียน

ดัชนีแบบผสมและลำดับคอลัมน์

เลือกลำดับคอลัมน์สำหรับดัชนีแบบผสม ทำความเข้าใจกฎคำนำหน้าด้านซ้าย และออกแบบดัชนีที่รองรับคำสั่งค้นหาหลายแบบ

ดัชนีแบบผสมและลำดับคอลัมน์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ดัชนี B-tree เทียบกับ Hash เทียบกับ GiST เทียบกับ GIN
  2. ดัชนีแบบผสมและลำดับคอลัมน์
  3. ดัชนีบางส่วนและดัชนีนิพจน์
  4. การดูแลรักษาดัชนีและข้อมูลบวม
← กลับไปที่ SQL Academy