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

ดัชนีบางส่วนและดัชนีนิพจน์

สร้างดัชนีเฉพาะแถวที่ต้องการด้วยเงื่อนไข WHERE และสร้างดัชนีจากนิพจน์ที่คำนวณแล้ว (lower(email), date_trunc('day', ts))

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

ดัชนีบางส่วน: สร้างดัชนีให้กับชุดย่อย

ดัชนีบางส่วนครอบคลุมเฉพาะแถวที่ตรงกับเงื่อนไข WHERE ตอนสร้างดัชนี มีขนาดเล็กกว่า เร็วกว่า และเหมาะอย่างยิ่งกับแบบสอบถามกรณีทั่วไป:

CREATE INDEX users_active_email_idx
  ON users(email)
  WHERE deleted_at IS NULL;

ดัชนีบางส่วนให้ผลดีที่สุดเมื่อใด

ใช้เมื่อ:

  • คุณกรองด้วยเพรดิเคตเดิมอยู่เสมอ เช่น การลบแบบนุ่มนวล
  • ค่าหนึ่งมีสัดส่วนมากในคอลัมน์ เช่น 95% ของแถวมีสถานะเป็น closed
  • คุณต้องการดัชนีขนาดเล็กที่ถูกใช้งานบ่อยและอยู่ในแคช

ตัวอย่าง: เซสชันที่ยังใช้งานอยู่

เซสชันส่วนใหญ่หมดอายุแล้ว จึงค้นหาเฉพาะเซสชันที่ยังใช้งานอยู่:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE expires_at > NOW();
-- Caveat: planner can't use NOW() in the index predicate — use a fixed timestamp
-- and reindex periodically, OR use a boolean column.

วิธีที่ดีกว่า: ใช้เพรดิเคตที่คงที่

เพรดิเคตของดัชนีต้องเป็น immutable นิพจน์ที่ขึ้นกับเวลา เช่น NOW() ไม่เข้าข่าย ควรใช้คอลัมน์อย่าง is_active แทน:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE is_active = true;

-- The query must use the same predicate to match the index:
SELECT * FROM sessions WHERE is_active = true AND user_id = 42;

ดัชนีนิพจน์

สร้างดัชนีจากฟังก์ชันของคอลัมน์:

CREATE INDEX users_email_lower_idx ON users(LOWER(email));

SELECT * FROM users WHERE LOWER(email) = LOWER('Alice@Example.com');
-- Uses the expression index.

ดัชนีนิพจน์ที่พบบ่อย

  • LOWER(email) สำหรับการค้นหาโดยไม่คำนึงถึงตัวพิมพ์เล็กใหญ่
  • (price * tax_rate) สำหรับการเรียงลำดับตามค่าที่คำนวณ
  • date_trunc('day', created_at) สำหรับรายงานรายวัน
  • (data ->> 'user_id')::BIGINT สำหรับดึงค่าจาก JSONB

นิพจน์ต้องเป็น IMMUTABLE

นิพจน์ต้องกำกับเป็น IMMUTABLE กล่าวคือผลลัพธ์ขึ้นอยู่กับอินพุตเท่านั้น RANDOM(), NOW(), CURRENT_USER ไม่เข้าข่าย

การใช้ดัชนีบางส่วนร่วมกับดัชนีนิพจน์

สามารถใช้ทั้งสองแบบร่วมกันได้:

CREATE INDEX articles_active_title_idx
  ON articles(LOWER(title))
  WHERE published_at IS NOT NULL;

ดัชนีบางส่วนแบบไม่ซ้ำกัน

รูปแบบคลาสสิกสำหรับมีแถวที่ใช้งานอยู่ได้เพียงหนึ่งแถว:

CREATE UNIQUE INDEX users_one_active_email
  ON users(email)
  WHERE deleted_at IS NULL;

-- Same email can exist many times in deleted users, but only once active.

เพรดิเคตของดัชนีต้องตรงกับแบบสอบถาม

ตัววางแผนจะใช้ดัชนีบางส่วนก็ต่อเมื่อเงื่อนไข WHERE ของแบบสอบถามบ่งบอกเพรดิเคตของดัชนี:

-- Index:  WHERE is_active = true
-- Match:  WHERE is_active = true AND user_id = 42       ✓
-- Match:  WHERE is_active AND user_id = 42             ✓
-- No:     WHERE user_id = 42                           ✗
-- No:     WHERE is_active IS NOT FALSE                 ✗ (logically same but planner may not realise)

อย่าใช้มากเกินไป

ดัชนีบางส่วนจำนวนมากที่ครอบคลุมชุดย่อยไม่ทับซ้อนกันอาจทำให้การเขียนช้าลง เพราะทุก INSERT ต้องอัปเดตดัชนีที่เกี่ยวข้องทั้งหมด ควรใช้กับแบบสอบถามที่เรียกใช้บ่อยอย่างจำกัด

สรุป

ดัชนีบางส่วนและดัชนีนิพจน์ให้ประสิทธิภาพมากขึ้นเมื่อเทียบกับพื้นที่ที่ใช้

  • ดัชนีบางส่วน: สร้างดัชนีเฉพาะชุดย่อยที่คุณค้นหา
  • ดัชนีนิพจน์: สร้างดัชนีให้กับค่าที่คำนวณแล้ว
  • ทั้งคู่ต้องใช้เพรดิเคต IMMUTABLE
  • แบบสอบถามต้องใช้เพรดิเคตเดียวกันจึงจะตรงกัน

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

คุณต้องการค้นหาอีเมลโดยไม่คำนึงถึงตัวพิมพ์เล็กใหญ่ ดัชนีใดมีประสิทธิภาพสูงสุด

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

บทเรียน “ดัชนีบางส่วนและดัชนีนิพจน์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ดัชนีบางส่วนและดัชนีนิพจน์”

สร้างดัชนีเฉพาะแถวที่ต้องการด้วยเงื่อนไข WHERE และสร้างดัชนีจากนิพจน์ที่คำนวณแล้ว (lower(email), date_trunc('day', ts)) คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ดัชนีบางส่วนและดัชนีนิพจน์” ใช้เวลานานแค่ไหน

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

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

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

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

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