การสร้างดัชนี JSONB ด้วย GIN
สร้างดัชนี GIN บนเอกสาร JSONB และใช้ jsonb_path_ops เพื่อให้คำสั่งค้นหาการมีข้อมูลครอบคลุมทำงานได้รวดเร็ว
การสร้างดัชนี JSONB ด้วย GIN เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงใช้ GIN กับ JSONB
เอกสาร JSONB มีรายการจำนวนมาก เช่น คู่คีย์และค่า รวมถึงสมาชิกอาร์เรย์ GIN หรือดัชนีกลับด้านทั่วไป ถูกออกแบบมาสำหรับแบบสอบถามที่ค้นหาแถวซึ่งเอกสารมีข้อมูล X
ดัชนี GIN เริ่มต้น
คลาสตัวดำเนินการเริ่มต้นรองรับ @>, ?, ?|, ?&:
CREATE INDEX events_data_gin ON events USING GIN (data);
-- These now use the index:
SELECT * FROM events WHERE data @> '{"type":"login"}';
SELECT * FROM events WHERE data ? 'error';jsonb_path_ops: เล็กกว่าและเร็วกว่า
มีขนาดเพียงครึ่งหนึ่งและเร็วกว่าเมื่อใช้กับแบบสอบถามที่ตรวจสอบการมีข้อมูลครอบคลุมเท่านั้น แต่รองรับเฉพาะ @>:
CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- Supports @>
-- Does NOT support ? ?| ?&
SELECT * FROM events WHERE data @> '{"type":"login"}';สร้างดัชนีให้กับพาธเดียว
หากคุณค้นหาด้วยคีย์เดียวเท่านั้น ดัชนี B-tree แบบนิพจน์ที่สร้างจากค่าที่ดึงออกมาจะเร็วยิ่งกว่า:
CREATE INDEX events_user_id_idx
ON events (((data->>'user_id')::BIGINT));
SELECT * FROM events WHERE (data->>'user_id')::BIGINT = 42;การสร้างดัชนีภายในอาร์เรย์
ใช้ดัชนี GIN กับพาธของอาร์เรย์:
CREATE INDEX events_tags_gin
ON events USING GIN ((data->'tags'));
SELECT * FROM events WHERE data->'tags' @> '["admin"]'::JSONB;การใช้ดัชนี JSONB ร่วมกับตัวกรองอื่น
เพรดิเคตแบบผสมสามารถใช้ดัชนี GIN กับส่วน JSONB และใช้ดัชนีอีกรายการกับส่วนที่ไม่ใช่ JSONB:
EXPLAIN ANALYZE
SELECT * FROM events
WHERE data @> '{"type":"login"}'
AND ts >= NOW() - INTERVAL '7 days';
-- BitmapAnd: GIN index on data, B-tree on tsประสิทธิภาพการเขียนของ GIN
การอัปเดต GIN มีต้นทุนสูงกว่า B-tree สำหรับตารางที่มีการเขียนจำนวนมาก ตัวเลือก fastupdate จะรวมการอัปเดต GIN ไว้ในรายการรอ ซึ่งจะถูกล้างโดย VACUUM
CREATE INDEX events_data_gin ON events USING GIN (data) WITH (fastupdate = on);
-- Flush manually if needed:
SELECT gin_clean_pending_list('events_data_gin');ขนาดดัชนี
ดัชนี GIN ของ JSONB อาจมีขนาดใหญ่ สำหรับตารางขนาดใหญ่มาก ควรพิจารณา:
- สร้างดัชนีเฉพาะพาธที่ต้องการ เช่น ดัชนีนิพจน์
- เปลี่ยนไปใช้ jsonb_path_ops สำหรับการตรวจสอบการมีข้อมูลครอบคลุมเท่านั้น
- แยกฟิลด์ที่มีการใช้งานสูงมาเป็นคอลัมน์จริง
การใช้ร่วมกับไตรแกรม
สำหรับการค้นหาข้อความแบบคลุมเครือภายใน JSONB ให้ดึงข้อมูลออกมาเป็นนิพจน์ TEXT แล้วเพิ่มดัชนี GIN ของไตรแกรม:
CREATE INDEX events_message_trgm
ON events USING GIN ((data->>'message') gin_trgm_ops);กรณีที่การสร้างดัชนีไม่ช่วย
หากตัวกรองของคุณแตะครบทุกแถว หรือมีความสามารถในการเลือกต่ำมาก ตัววางแผนอาจเลือกการสแกนตามลำดับแม้จะมีดัชนี ใช้ EXPLAIN ANALYZE เพื่อยืนยัน
การดูแลดัชนี JSONB
ดัชนี GIN บวมได้เช่นเดียวกับดัชนีอื่น ใช้ REINDEX CONCURRENTLY เป็นระยะ:
REINDEX INDEX CONCURRENTLY events_data_gin;สรุป
GIN เปลี่ยนตัวกรอง JSONB ให้เป็นการค้นหาที่ใช้เวลาเพียงระดับมิลลิวินาที
- GIN เริ่มต้น: @>, ?, ?|, ?&
- jsonb_path_ops: ขนาดเล็กกว่า ใช้สำหรับการตรวจสอบการมีข้อมูลครอบคลุมเท่านั้น
- B-tree แบบนิพจน์บนค่าพื้นฐานที่ดึงออกมา: เร็วที่สุดสำหรับคีย์เดียว
ตรวจสอบความเข้าใจอย่างรวดเร็ว
คุณค้นหาด้วย data @> ... บนคอลัมน์ JSONB เท่านั้น ดัชนีใดมีขนาดเล็กที่สุดและรองรับความสามารถได้ครบถ้วน
คำถามที่พบบ่อย
บทเรียน “การสร้างดัชนี JSONB ด้วย GIN” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างดัชนี JSONB ด้วย GIN” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างดัชนี JSONB ด้วย GIN”
สร้างดัชนี GIN บนเอกสาร JSONB และใช้ jsonb_path_ops เพื่อให้คำสั่งค้นหาการมีข้อมูลครอบคลุมทำงานได้รวดเร็ว คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างดัชนี JSONB ด้วย GIN” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- JSONB เทียบกับ JSON: ควรใช้แบบใด
- ตัวดำเนินการเส้นทาง: -> ->> @>
- การสร้างดัชนี JSONB ด้วย GIN
- การสร้างแบบจำลอง: เมื่อ JSONB เหมาะกว่าการทำให้เป็นบรรทัดฐาน