0Pricing
Coding Interview Prep · บทเรียน

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

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

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

คำถามเรื่องดัชนีแบบผสม

เมื่อคุณอธิบายดัชนีคอลัมน์เดียวได้แล้ว ผู้สัมภาษณ์จะยกระดับคำถามขึ้นว่า ‘คุณค้นหาด้วยรหัสลูกค้าและวันที่สั่งซื้อพร้อมกัน จะสร้างดัชนีอย่างไร?’ คำตอบที่คาดหวังคือดัชนีแบบผสมหรือหลายคอลัมน์ พร้อมเหตุผลสนับสนุนลำดับคอลัมน์

บทเรียนนี้สอนกฎคำนำหน้าซ้ายสุด ซึ่งเป็นแนวคิดเดียวที่อธิบายคำถามเกี่ยวกับดัชนีแบบผสมได้เกือบทุกข้อที่คุณจะพบ

ดัชนีแบบผสมคืออะไร

ดัชนีแบบผสมจะสร้างดัชนีให้หลายคอลัมน์เป็นชุดค่าแบบมีลำดับ รายการต่าง ๆ จะเรียงตามคอลัมน์แรกก่อน จากนั้นจึงเรียงตามคอลัมน์ที่สองภายในกลุ่มที่มีค่าเท่ากัน แล้วจึงทำเช่นนี้ต่อไปตามลำดับ เช่นเดียวกับสมุดโทรศัพท์ที่เรียงตามนามสกุลก่อน แล้วจึงเรียงตามชื่อ

ลำดับมีความสำคัญอย่างมาก เพราะลำดับความสำคัญในการเรียงจะเป็นไปตามลำดับคอลัมน์ที่คุณประกาศ

CREATE INDEX idx_orders_cust_date
  ON orders (customer_id, order_date);

กฎคำนำหน้าซ้ายสุด

กฎสำคัญคือ ดัชนีแบบผสมบน (A, B, C) สามารถใช้กับคิวรีที่กรองด้วยคำนำหน้าซ้ายสุดของคอลัมน์เหล่านั้นได้:

  • A เพียงอย่างเดียว ได้
  • A, B ได้
  • A, B, C ได้
  • B เพียงอย่างเดียว NO
  • B, C NO

ลองนึกถึงสมุดโทรศัพท์: คุณสามารถค้นหาทุกคนที่มีนามสกุล ‘สมิธ’ ได้ แต่ไม่สามารถค้นหาทุกคนที่ชื่อ ‘จอห์น’ โดยไม่สนใจนามสกุลได้อย่างมีประสิทธิภาพ เพราะสมุดไม่ได้เรียงในลักษณะนั้น

ตัวอย่าง: การใช้คำนำหน้าได้สำเร็จ

เมื่อมีดัชนีบน (customer_id, order_date) คิวรีเหล่านี้สามารถใช้ดัชนีได้ เพราะเริ่มต้นด้วย customer_id:

คิวรีแรกใช้เฉพาะคอลัมน์นำ คิวรีที่สองใช้ทั้งสองคอลัมน์ โดยจำกัดด้วย customer_id ก่อน แล้วจึงค้นหาภายในรายการของลูกค้ารายนั้นที่เรียงตามวันที่

-- Uses the index (leading column)
SELECT * FROM orders WHERE customer_id = 42;

-- Uses the index fully (both columns, in order)
SELECT * FROM orders
WHERE customer_id = 42
  AND order_date >= '2026-01-01';

ตัวอย่าง: การใช้คำนำหน้าไม่ได้

คิวรีนี้กรองเฉพาะคอลัมน์ที่สอง ดังนั้นโดยทั่วไปดัชนีบน (customer_id, order_date) จึงไม่สามารถใช้เป็นตัวขับการค้นหาได้ เพราะรายการต่าง ๆ ไม่ได้เรียงตาม order_date ทั่วทั้งดัชนี

หากการกรองด้วย order_date เพียงอย่างเดียวเป็นรูปแบบที่ใช้บ่อย คุณต้องมีดัชนีแยกต่างหากที่เริ่มต้นด้วย order_date

-- Does NOT use idx_orders_cust_date efficiently
SELECT * FROM orders
WHERE order_date >= '2026-01-01';

-- Fix: an index that leads with order_date
CREATE INDEX idx_orders_date ON orders (order_date);

ความเท่ากันก่อนช่วง

ข้อปรับปรุงระดับอาวุโสคือ ให้ใส่คอลัมน์ที่ใช้กับความเท่ากัน (=) ไว้ก่อนคอลัมน์ที่ใช้กับช่วง (<, >, BETWEEN) เมื่อดัชนีมาถึงคอลัมน์ช่วงแล้ว จะไม่สามารถใช้คอลัมน์ถัดไปเพื่อจำกัดการค้นหาให้แคบลงได้อีก

สำหรับคิวรีอย่าง status = 'paid' AND created_at > ? ลำดับที่ถูกต้องคือ (status, created_at) ไม่ใช่ลำดับกลับกัน

-- Query: WHERE status = 'paid' AND created_at > '2026-01-01'
-- Good: equality column first
CREATE INDEX idx_orders_status_created
  ON orders (status, created_at);

การเลือกคอลัมน์นำ

คุณควรเลือกคอลัมน์แรกอย่างไร ผู้สัมภาษณ์ต้องการคำตอบที่อิงตามรูปแบบการใช้งาน:

  • เลือกคอลัมน์ที่ปรากฏในคิวรีมากที่สุดเป็นคอลัมน์นำ โดยเฉพาะเมื่อใช้เป็นเงื่อนไขกรองแบบความเท่ากัน
  • เลือกคอลัมน์ที่มีความจำเพาะสูง หรือมีค่าที่แตกต่างกันจำนวนมาก เพื่อให้ขั้นตอนแรกตัดแถวออกได้มากที่สุด
  • พิจารณาความต้องการด้านORDER BY ด้วย การจัดลำดับดัชนีให้ตรงกันอาจช่วยหลีกเลี่ยงการจัดเรียงได้

คอลัมน์นำคือคอลัมน์ที่ทำงานกรองหนักที่สุดในชุดคิวรีจริงของคุณ

ดัชนีแบบผสมช่วยจัดเรียง

ดัชนีแบบผสมยังรองรับ ORDER BY บนคำนำหน้าซ้ายสุดด้วย เนื่องจากรายการต่าง ๆ เรียงตาม customer_id แล้วจึงตาม order_date คิวรีสำหรับคำสั่งซื้อของลูกค้ารายหนึ่งที่เรียงตามวันที่จึงแทบไม่เสียต้นทุน และไม่จำเป็นต้องจัดเรียงแยกต่างหาก

-- No sort step: the index already supplies this order
SELECT * FROM orders
WHERE customer_id = 42
ORDER BY order_date;

อย่าสร้างดัชนีซ้ำซ้อน

ผู้สมัครมักสร้างดัชนีมากเกินไป หากคุณมี (customer_id, order_date) อยู่แล้ว ดัชนีแยกต่างหากบน (customer_id) เพียงอย่างเดียวมักซ้ำซ้อน เพราะดัชนีแบบผสมครอบคลุมคิวรีที่ใช้คอลัมน์นำอยู่แล้ว

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

พิสูจน์ด้วย EXPLAIN

เช่นเคย ให้ยืนยันการเลือกของตัววางแผน หลังจากสร้างดัชนีแบบผสมแล้ว ให้เรียกใช้ EXPLAIN และตรวจสอบว่าดัชนีปรากฏเป็นการสแกนด้วยดัชนีหรือไม่ รวมทั้งตรวจสอบจำนวนแถวที่ตัววางแผนประมาณการไว้

หากคิวรีที่ไม่ตรงกับคำนำหน้ากลับไปใช้การสแกนตามลำดับ นั่นคือหลักฐานว่าลำดับคอลัมน์ไม่เหมาะกับภาระงาน และเป็นสิ่งที่คุณควรอธิบายให้ผู้สัมภาษณ์ฟัง

EXPLAIN
SELECT * FROM orders
WHERE customer_id = 42
  AND order_date >= '2026-01-01';

วิธีพูดเรื่องนี้ในการสัมภาษณ์

สรุปสั้น ๆ ได้ดังนี้:

‘ดัชนีแบบผสมจะเรียงตามคอลัมน์จากซ้ายไปขวา จึงรองรับคำนำหน้าซ้ายสุดของคอลัมน์เหล่านั้นได้ แต่ไม่รองรับเฉพาะกลุ่มคอลัมน์ที่อยู่ท้ายสุด ผมจะเลือกคอลัมน์ที่ใช้กรองมากที่สุดและมีความจำเพาะสูงไว้เป็นคอลัมน์นำ วางเงื่อนไขแบบความเท่ากันไว้ก่อนเงื่อนไขแบบช่วง และจัดลำดับให้ตรงกับ ORDER BY เมื่อทำได้ จากนั้นจึงตรวจสอบด้วย EXPLAIN’

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

นำกฎคำนำหน้าซ้ายสุดไปใช้

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

ประเด็นสำคัญ:

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

ถัดไป: ดัชนีครอบคลุมที่กำจัดการดึงข้อมูลจากฮีปได้ทั้งหมด

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

บทเรียน “ลำดับคอลัมน์ในดัชนีผสม” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ลำดับคอลัมน์ในดัชนีผสม”

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

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

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

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

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

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

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

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

  1. ดัชนี B-Tree และประโยชน์ของดัชนี
  2. ลำดับคอลัมน์ในดัชนีผสม
  3. ดัชนีครอบคลุมและการสแกนเฉพาะดัชนี
  4. เมื่อดัชนีส่งผลเสีย: การเขียนและความสามารถในการเลือกข้อมูล
← กลับไปที่ Coding Interview Prep