ดัชนี B-Tree และประโยชน์ของดัชนี
ดูว่าดัชนีจัดเก็บอะไรจริง ๆ และช่วยเร่งการดำเนินการใดบ้าง
ดัชนี B-Tree และประโยชน์ของดัชนี เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุผลที่ผู้สัมภาษณ์ถามเรื่องดัชนี
เมื่อผู้สัมภาษณ์ถามว่า ‘คิวรีนี้ช้า คุณจะทำอย่างไร?’ คำตอบที่พวกเขาคาดหวังเกือบทุกครั้งจะเกี่ยวข้องกับดัชนี ดัชนีเป็นปัจจัยเดียวที่ส่งผลต่อประสิทธิภาพการอ่านมากที่สุด จึงช่วยแยกผู้สมัครที่ท่องจำไวยากรณ์ออกจากผู้ที่เข้าใจว่าฐานข้อมูลค้นหาแถวจริงอย่างไร
ในบทเรียนนี้ คุณจะสร้างแบบจำลองความเข้าใจที่แม่นยำของดัชนีบีทรี ทั้งสิ่งที่ดัชนีจัดเก็บ การดำเนินการที่ดัชนีช่วยเร่ง และวิธีอธิบายเรื่องนี้แบบวิศวกรอาวุโส
ปัญหาที่ดัชนีช่วยแก้
หากไม่มีดัชนี การค้นหาแถวที่ตรงกับเงื่อนไขจะบังคับให้ฐานข้อมูลอ่านทุกแถวในตาราง กระบวนการนี้เรียกว่าการสแกนตามลำดับ หรือการสแกนทั้งตาราง สำหรับตารางที่มีหนึ่งล้านแถว นั่นหมายถึงต้องตรวจสอบหนึ่งล้านแถว แม้ว่าจะมีเพียงแถวเดียวที่ตรงกันก็ตาม
ดัชนีคือโครงสร้างข้อมูลที่แยกออกมาและจัดเรียงลำดับไว้ ช่วยให้ระบบข้ามไปยังแถวที่ตรงกันได้โดยตรง เช่นเดียวกับดัชนีท้ายหนังสือที่ช่วยให้คุณค้นหาหัวข้อได้โดยไม่ต้องอ่านทุกหน้า
-- No index: the engine reads ALL rows to find this one
SELECT * FROM users WHERE email = 'ada@example.com';ดัชนีบีทรีจัดเก็บอะไรไว้จริง
ดัชนีเริ่มต้นใน PostgreSQL, MySQL, เซิร์ฟเวอร์ SQL และระบบส่วนใหญ่คือบีทรี หรือต้นไม้สมดุล ดัชนีนี้จัดเก็บค่าของคอลัมน์ที่ทำดัชนีไว้ในลำดับที่เรียงแล้ว โดยจัดเป็นต้นไม้แบบตื้นที่ประกอบด้วยหน้า
- โหนดใบแต่ละโหนดเก็บคีย์ของดัชนีและตัวชี้ไปยังแถวจริงในตาราง
- ต้นไม้ยังคงสมดุลอยู่เสมอ ดังนั้นการค้นหาแต่ละครั้งจึงแตะเพียงไม่กี่หน้า ไม่ว่าตารางจะมีขนาดเท่าใด
การค้นหาจะเดินจากรากลงไปยังโหนดใบ โดยใช้ประมาณ log(N) ขั้นตอน แทนที่จะสแกนแถวทั้ง N แถว
การสร้างดัชนีแรกของคุณ
คุณสร้างดัชนีแบบบีทรีด้วย CREATE INDEX ควรตั้งชื่อให้ชัดเจน เพื่อให้ผู้ตรวจทานทราบตารางและคอลัมน์ได้ทันที
เมื่อมีดัชนีนี้แล้ว คิวรีที่กรองด้วย email จะใช้ดัชนีค้นหาแถวที่ตรงกันด้วยการอ่านเพียงไม่กี่หน้า แทนการสแกนทั้งตาราง
CREATE INDEX idx_users_email ON users (email);
-- Now this lookup uses the index instead of scanning
SELECT * FROM users WHERE email = 'ada@example.com';การดำเนินการที่บีทรีช่วยเร่ง
เนื่องจากบีทรีเก็บค่าไว้ในลำดับที่เรียงแล้ว จึงช่วยเร่งได้มากกว่าการค้นหาค่าที่ตรงกันทุกประการ ผู้สัมภาษณ์มักชื่นชอบเมื่อคุณแจกแจงได้อย่างแม่นยำ:
- ความเท่ากัน:
WHERE email = ? - ช่วง:
WHERE age > 30,BETWEEN,<,>= - การจับคู่คำนำหน้า:
WHERE name LIKE 'Ada%'แต่ NOT ใช้กับ'%da' - ORDER BY บนคอลัมน์ที่ทำดัชนี ซึ่งช่วยหลีกเลี่ยงการจัดเรียง
- MIN/MAX เนื่องจากค่าเหล่านี้อยู่ที่ปลายทั้งสองของโครงสร้างที่เรียงลำดับ
ตัวอย่าง: คิวรีช่วง
ลองพิจารณาตารางคำสั่งซื้อที่มีหลายล้านแถว คิวรีสำหรับรายงานต้องการคำสั่งซื้อล่าสุด เมื่อมีดัชนีบน created_at ระบบจะค้นหาไปยังจุดเริ่มต้นของช่วงในดัชนีที่เรียงลำดับไว้ แล้วเดินไปข้างหน้าเท่าที่จำเป็น
ดัชนีเปลี่ยนการสแกนทั้งตารางให้เป็นการสแกนช่วงที่มีขอบเขต โดยอ่านเฉพาะส่วนที่ตรงตามเงื่อนไข
CREATE INDEX idx_orders_created_at ON orders (created_at);
SELECT order_id, total
FROM orders
WHERE created_at >= '2026-01-01'
AND created_at < '2026-02-01';ดัชนีช่วยจัดเรียงได้ด้วย
ประเด็นที่มักถูกมองข้ามคือ เนื่องจากดัชนีเรียงลำดับไว้แล้ว ระบบจึงส่งคืนแถวตามลำดับของดัชนีและข้ามขั้นตอนการจัดเรียงแยกต่างหากได้ เรื่องนี้สำคัญต่อ ORDER BY และยิ่งสำคัญเป็นพิเศษต่อการแบ่งหน้าแบบ N อันดับแรก
หากคุณจัดเรียงตามคอลัมน์ที่มีดัชนีตรงกัน ตัวปรับประสิทธิภาพสามารถอ่านดัชนีตามลำดับและหยุดได้ทันทีเมื่อได้แถวครบตามจำนวนที่ต้องการ
-- Index on created_at lets this avoid a sort and stop after 10 rows
SELECT order_id, total
FROM orders
ORDER BY created_at DESC
LIMIT 10;ต้นทุนแฝง: การดึงข้อมูลจากฮีป
ดัชนีบีทรีทั่วไปจะเก็บเฉพาะคอลัมน์ที่ทำดัชนีและตัวชี้แถว ดังนั้นหลังจากพบรายการที่ตรงกันแล้ว ระบบยังต้องไปที่ตารางหรือฮีปเพื่ออ่านคอลัมน์อื่นที่คุณเลือก
การเข้าถึงรอบที่สองนี้เรียกว่าการดึงข้อมูลจากฮีป ซึ่งมีต้นทุนต่ำเมื่อมีเพียงไม่กี่แถว แต่มีต้นทุนสูงเมื่อคิวรีตรงกับหลายแถว นี่เป็นเหตุผลหนึ่งที่บางครั้งระบบไม่เลือกใช้ดัชนีที่มีความจำเพาะต่ำ (ภายหลังคุณจะเห็นว่าดัชนีแบบครอบคลุมช่วยแก้ปัญหานี้ได้)
การยืนยันว่ามีการใช้ดัชนี
อย่าอ้างว่ามีการใช้ดัชนีโดยไม่มีหลักฐาน ให้พิสูจน์ด้วย EXPLAIN ในการสัมภาษณ์ การอธิบายแผนการทำงานไปด้วยจะแสดงให้เห็นว่าคุณเข้าใจจริง
Seq Scanหมายความว่าไม่ได้ใช้ดัชนีIndex ScanหรือIndex Seekหมายความว่ามีการใช้ดัชนี
หากคุณเพิ่มดัชนีแล้วแต่ยังเห็นการสแกนตามลำดับ ตัววางแผนตัดสินว่าการสแกนดังกล่าวมีต้นทุนต่ำกว่า ซึ่งมักเกิดจากคิวรีตรงกับสัดส่วนของตารางที่มากเกินไป
EXPLAIN
SELECT * FROM users WHERE email = 'ada@example.com';
-- Look for: Index Scan using idx_users_emailคีย์หลักมีดัชนีอยู่แล้ว
จุดหลอกที่พบบ่อยในการสัมภาษณ์คือ การประกาศ PRIMARY KEY หรือข้อจำกัด UNIQUE จะสร้างดัชนีบีทรีสำหรับรองรับโดยอัตโนมัติ คุณไม่จำเป็นและไม่ควรเพิ่มดัชนีที่สองบนคอลัมน์เดียวกัน
นี่คือเหตุผลที่การเชื่อมตารางและการค้นหาด้วยคีย์หลักทำงานได้รวดเร็วอยู่แล้ว และเหตุผลที่คำถามว่า ‘ควรสร้างดัชนีให้คอลัมน์รหัสประจำตัวหรือไม่?’ มักเป็นคำถามหลอก เพราะระบบจัดการให้คุณเรียบร้อยแล้ว
-- This already builds a unique B-Tree index on (id)
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email TEXT UNIQUE
);วิธีพูดเรื่องนี้ในการสัมภาษณ์
สรุปให้เป็นประโยคสั้น ๆ ที่ผู้สัมภาษณ์เห็นด้วยได้ดังนี้:
‘ดัชนีบีทรีคือโครงสร้างที่เรียงลำดับและสมดุล ช่วยให้ระบบค้นหาแถวด้วยการอ่านหน้าประมาณ log(N) หน้า แทนการสแกนทั้งตาราง ดัชนีช่วยเร่งการดำเนินการแบบความเท่ากัน แบบช่วง แบบคำนำหน้า และ ORDER BY บนคอลัมน์ที่ทำดัชนี แต่การจับคู่แต่ละครั้งยังมีต้นทุนการดึงข้อมูลจากฮีปสำหรับคอลัมน์ที่ไม่ได้อยู่ในดัชนี’
จากนั้นสนับสนุนคำอธิบายด้วย EXPLAIN การผสานแบบจำลองกับหลักฐานนี้คือสิ่งที่ทำให้ได้คะแนน
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบแบบจำลองในใจของคุณเกี่ยวกับการดำเนินการที่ดัชนีบีทรีช่วยเร่ง
ทบทวน: ดัชนีบีทรี
ประเด็นสำคัญที่ควรนำไปใช้ในบทเรียนถัดไป:
- บีทรีจัดเก็บค่าที่ทำดัชนีไว้ในลำดับที่เรียงแล้วภายในต้นไม้สมดุล จึงค้นหาได้ด้วย
log(N)ขั้นตอน - ช่วยเร่งการดำเนินการแบบความเท่ากัน ช่วง คำนำหน้า LIKE ที่อยู่ต้นข้อความ ORDER BY และ MIN/MAX
- การจับคู่แต่ละครั้งยังต้องดึงข้อมูลจากฮีปสำหรับคอลัมน์ที่ไม่ได้อยู่ในดัชนี
- การห่อคอลัมน์ด้วยฟังก์ชันหรือใช้อักขระตัวแทนที่อยู่ต้นข้อความจะทำให้ดัชนีใช้ไม่ได้
- ตรวจสอบด้วย
EXPLAINเสมอ โดยข้อจำกัด PRIMARY KEY และ UNIQUE จะสร้างดัชนีโดยอัตโนมัติ
ถัดไป: วิธีจัดลำดับคอลัมน์เมื่อดัชนีเดียวครอบคลุมหลายคอลัมน์พร้อมกัน
คำถามที่พบบ่อย
บทเรียน “ดัชนี B-Tree และประโยชน์ของดัชนี” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ดัชนี B-Tree และประโยชน์ของดัชนี” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ดัชนี B-Tree และประโยชน์ของดัชนี”
ดูว่าดัชนีจัดเก็บอะไรจริง ๆ และช่วยเร่งการดำเนินการใดบ้าง คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ดัชนี B-Tree และประโยชน์ของดัชนี” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม
ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ดัชนี B-Tree และประโยชน์ของดัชนี
- ลำดับคอลัมน์ในดัชนีผสม
- ดัชนีครอบคลุมและการสแกนเฉพาะดัชนี
- เมื่อดัชนีส่งผลเสีย: การเขียนและความสามารถในการเลือกข้อมูล