Back to notes
mastery-data-sql
Featured

SQL Indexing Mastery: เรดาร์นำทาง Database ระดับ Enterprise

เจาะลึกกลไก B-Tree Index ตั้งแต่วันที่ข้อมูลบวมจน Query อืด ไปจนถึงการวิเคราะห์ Trade-offs ระหว่างความเร็วในการอ่านและเขียน

January 30, 20262 min read readNNexis by Seereen

🛑 1. The Problem First: วันที่ "บ้านบวม" จนหาของไม่เจอ

ลองนึกภาพว่าคุณมีตาราง orders ที่ตอนแรกมีแค่ 100 แถว:

HLJS SQL
-- ❌ การค้นหาแบบไม่มี Index
SELECT * FROM orders WHERE customer_name = 'Somchai';

ปัญหา: ตอนข้อมูลน้อยๆ มันก็เร็วดีครับ แต่พอผ่านไป 1 ปี ข้อมูลบวมขึ้นเป็น 1,000,000 แถว Database ต้องเปิดอ่านข้อมูล "ทีละแถว" ตั้งแต่แถวแรกจนถึงแถวสุดท้าย (Sequential Scan) เพื่อหาว่ามีชื่อ Somchai ไหม เว็บคุณจะเริ่มหมุนติ้วๆ และ Database CPU จะพุ่งกระฉูดจน Server พัง!


💡 2. Real-Life Analogy: สมุดโทรศัพท์ที่ไม่มีตัวอักษรนำหน้า

ลองนึกภาพว่าคุณกำลัง "หาเบอร์เพื่อนในสมุดโทรศัพท์ยักษ์".

  • No Index (Sequential Scan): คุณต้องเปิดสมุดทีละหน้า ตั้งแต่หน้า 1 ไปเรื่อยๆ จนกว่าจะเจอชื่อเพื่อน ถ้าเพื่อนชื่อ "อานนท์" อาจจะเจอเร็ว แต่ถ้าชื่อ "ฮาเล็ม" คุณต้องเปิดจนจบเล่ม!
  • With Index (B-Tree): คือการที่คุณมี "สารบัญ" ก-ฮ อยู่ด้านหน้า คุณเปิดไปที่หมวด "ฮ" ปุ๊บ มันบอกว่าอยู่หน้า 900 คุณกระโดดไปหน้านั้นทันที รวดเร็วและแม่นยำ

🚀 3. Execution Journey: ขั้นตอนการเดินทางของ Query

เมื่อคุณเรียกค้นหาข้อมูลที่มี Index กระบวนการ "Index Seek" จะทำงานดังนี้:

🛠 Step-by-step:

  1. Root Node: Database จะเข้าไปดูที่จุดสูงสุดก่อน (เช่น อักษร ก-ฮ)
  2. Intermediate Nodes: ระบบจะตัดสินใจว่า "Somchai" อยู่ช่วงไหน (เช่น ร-ฮ) แล้วกระโดดข้ามช่วงอื่นไปเลย
  3. Leaf Node: เมื่อถึงจุดสุดท้าย มันจะบอก "ที่อยู่จริงๆ (Physical Address)" ของข้อมูลใน Harddisk
  4. Fetch: Database วิ่งไปหยิบข้อมูลออกมาส่งให้คุณ
HLJS SQL
-- ✅ Best Practice: สร้าง Index บนคอลัมน์ที่ถูกค้นหาบ่อย (WHERE) หรือใช้จอย (JOIN)
CREATE INDEX idx_customer_name ON orders (customer_name);

🪤 4. The Junior Trap: โรค "บ้า Index"

จูเนียร์ที่เคยเจอความเร็วของ Index มักจะทำแบบนี้:

HLJS SQL
-- ❌ Junior Trap: สร้าง Index ทุกคอลัมน์ในตาราง
CREATE INDEX idx_col1 ON table (col1);
CREATE INDEX idx_col2 ON table (col2);
CREATE INDEX idx_col3 ON table (col3); ...

ระวัง: ทุกครั้งที่คุณสร้าง Index คือการสร้าง "สมุดจดเล่มใหม่" เพิ่มขึ้นมา

  1. มันกินพื้นที่ Storage
  2. เวลาคุณ INSERT/UPDATE ข้อมูล Database ต้องเดินไปเขียนสมุดเหล่านั้นใหม่ทุกลดเล่ม! ยิ่ง Index เยอะ การเขียนข้อมูลยิ่งช้าลงมหาศาล ✅ การแก้ไข: สร้างเฉพาะคอลัมน์ที่มีการสืบค้น (WHERE) หรือเรียงลำดับ (ORDER BY) บ่อยๆ เท่านั้น

⚖️ 5. The Why Matrix: ราคาที่ต้องจ่าย

หัวข้อScan (ไม่มี Index)Seek (มี Index)
ความเร็วในการอ่านช้าลงตามปริมาณข้อมูล (O(N))เร็วคงที่เสมอ (O(log N))
ความเร็วในการเขียนเร็วที่สุด (เขียนตรงๆ จบ)ช้าลง (ต้องอัปเดตสารบัญ)
พื้นที่จัดเก็บใช้แค่ที่เก็บข้อมูลจริงใช้พื้นที่เพิ่ม 10-30%

🎓 6. Senior Mindset Summary

การเป็น Senior คือการบริหารจัดการ "สมดุลระหว่างความเร็วในการอ่าน (Read) และการเขียน (Write)" การทำ Index คือการจำนองความเร็วของการเขียนเพื่อมาซื้อความเร็วในการอ่านครับ!

Share this note

Mission Accomplished

You've reached the end of this module. Time to apply these senior mindsets to your real-world projects!

Explore more topics

© 2026 My Notes by Seereen