ดัชนีบางส่วนและดัชนีนิพจน์
สร้างดัชนีเฉพาะแถวที่ต้องการด้วยเงื่อนไข 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ดัชนี B-tree เทียบกับ Hash เทียบกับ GiST เทียบกับ GIN
- ดัชนีแบบผสมและลำดับคอลัมน์
- ดัชนีบางส่วนและดัชนีนิพจน์
- การดูแลรักษาดัชนีและข้อมูลบวม