ลำดับคอลัมน์ในดัชนีผสม
กฎคำนำหน้าซ้ายสุด และการเลือกลำดับคอลัมน์ที่เหมาะกับรูปแบบการใช้งาน
ลำดับคอลัมน์ในดัชนีผสม เป็นบทเรียน 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เพียงอย่างเดียว NOB, CNO
ลองนึกถึงสมุดโทรศัพท์: คุณสามารถค้นหาทุกคนที่มีนามสกุล ‘สมิธ’ ได้ แต่ไม่สามารถค้นหาทุกคนที่ชื่อ ‘จอห์น’ โดยไม่สนใจนามสกุลได้อย่างมีประสิทธิภาพ เพราะสมุดไม่ได้เรียงในลักษณะนั้น
ตัวอย่าง: การใช้คำนำหน้าได้สำเร็จ
เมื่อมีดัชนีบน (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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ดัชนี B-Tree และประโยชน์ของดัชนี
- ลำดับคอลัมน์ในดัชนีผสม
- ดัชนีครอบคลุมและการสแกนเฉพาะดัชนี
- เมื่อดัชนีส่งผลเสีย: การเขียนและความสามารถในการเลือกข้อมูล