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

การสร้างดัชนี 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. JSONB เทียบกับ JSON: ควรใช้แบบใด
  2. ตัวดำเนินการเส้นทาง: -> ->> @>
  3. การสร้างดัชนี JSONB ด้วย GIN
  4. การสร้างแบบจำลอง: เมื่อ JSONB เหมาะกว่าการทำให้เป็นบรรทัดฐาน
← กลับไปที่ SQL Academy