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

ดัชนี B-tree เทียบกับ Hash เทียบกับ GiST เทียบกับ GIN

เปรียบเทียบชนิดดัชนีหลักใน PostgreSQL และเลือกชนิดที่เหมาะสมสำหรับคำสั่งค้นหาแบบเท่ากัน ช่วงข้อมูล รูปทรงเรขาคณิต JSON และการค้นหาข้อความเต็ม

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

ภาพรวมประเภทดัชนี

PostgreSQL มีดัชนีหลายประเภท ซึ่งแต่ละประเภทได้รับการปรับให้เหมาะกับรูปแบบการเข้าถึงที่แตกต่างกัน:

  • B-tree — การเปรียบเทียบความเท่ากันและช่วง (ค่าเริ่มต้น)
  • แฮช — การเปรียบเทียบความเท่ากันเท่านั้น
  • GiST — ข้อมูลเรขาคณิต ข้อความแบบเต็ม และการใช้งานที่กำหนดเอง
  • GIN — ค่าประกอบ (อาร์เรย์, JSONB, ข้อความแบบเต็ม)
  • BRIN — ช่วงบล็อก — ตารางขนาดใหญ่ที่เรียงลำดับแล้ว
  • SP-GiST — ต้นไม้ที่แบ่งพื้นที่

B-tree: ค่าเริ่มต้น

ใช้ในงานประมาณ 95% รองรับ =, <, <=, >, >=, BETWEEN, ORDER BY:

CREATE INDEX users_email_idx ON users(email);
CREATE INDEX orders_created_at_idx ON orders(created_at DESC);

ดัชนีแฮช

ใช้ค้นหาค่าที่เท่ากันเท่านั้น ปลอดภัยจากการหยุดทำงานฉับพลันตั้งแต่ PG 10 มีขนาดเล็กกว่าและเร็วกว่า B-tree เล็กน้อยสำหรับการเปรียบเทียบความเท่ากันล้วน ๆ แต่มีกรณีใช้งานค่อนข้างจำกัด:

CREATE INDEX sessions_token_hash ON sessions USING HASH (token);
-- Useful for very high-cardinality equality lookups; usually B-tree is fine.

ดัชนี GiST

ต้นไม้ค้นหาทั่วไปแบบขยายได้ — รองรับชนิดข้อมูลช่วง ชนิดข้อมูลเรขาคณิต ที่อยู่ IP และข้อความแบบเต็ม:

CREATE INDEX events_during_idx ON events USING GIST (during);
-- 'during' is a tstzrange — finds overlapping ranges efficiently.

CREATE INDEX places_location_idx ON places USING GIST (location);
-- PostGIS geometry — nearest neighbour, intersects.

ดัชนี GIN

ดัชนีกลับด้านแบบขยายได้ — เหมาะที่สุดสำหรับค่าประกอบที่แต่ละรายการเชื่อมโยงกับหลายแถว:

CREATE INDEX articles_tags_gin ON articles USING GIN (tags);
-- tags is TEXT[]; query with @> or && operators

CREATE INDEX articles_doc_gin ON articles USING GIN (search_doc);
-- For tsvector full-text search

CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- For JSONB containment queries

ดัชนี BRIN

ดัชนีช่วงบล็อกสรุปช่วงค่าต่อ N หน้า มีขนาดเล็กมาก (ระดับกิโลไบต์สำหรับตารางระดับเทราไบต์) แต่จะมีประสิทธิภาพก็ต่อเมื่อข้อมูลเรียงลำดับทางกายภาพตามคอลัมน์ที่ทำดัชนี:

CREATE INDEX events_ts_brin ON events USING BRIN (ts);
-- Excellent for append-only time-series tables.

การเปรียบเทียบขนาด

สำหรับตารางที่มีหนึ่งพันล้านแถว:

  • B-tree บน BIGINT: ~30 GB
  • BRIN บน TIMESTAMPTZ: ~1 MB

BRIN มีขนาดเล็กกว่าอย่างมาก แต่จะชนะ B-tree เฉพาะกับคำสั่งค้นหาตามลำดับหรือคำสั่งค้นหาที่ใช้ข้อมูลเรียงลำดับแล้วเท่านั้น

การเลือกประเภทดัชนี

ลำดับการตัดสินใจ:

  • ความเท่ากัน + ช่วงบนค่าพื้นฐาน → B-tree
  • ความเท่ากันบนชุดค่าพื้นฐานขนาดใหญ่มาก → B-tree (ใช้แฮชก็ต่อเมื่อวัดผลแล้ว)
  • อาร์เรย์ / JSONB / ข้อความแบบเต็ม → GIN
  • ชนิดข้อมูลช่วง เรขาคณิต และข้อความคลุมเครือ → GiST
  • ตารางขนาดมหึมาที่เรียงลำดับและมีการเพิ่มข้อมูลต่อท้ายเท่านั้น → BRIN

ข้อแลกเปลี่ยนของ GIN

GIN เร็วที่สุดสำหรับคำสั่งค้นหาแบบ "ค้นหาทุกแถวที่มี X" แต่การ INSERT/UPDATE จะช้ากว่า B-tree สำหรับตารางที่มีการเขียนข้อมูลจำนวนมาก ควรพิจารณาใช้ fastupdate=off เพื่อควบคุมรายการรอของ GIN

คลาสของตัวดำเนินการ

ดัชนีแต่ละประเภททำงานร่วมกับตัวดำเนินการเฉพาะ JSONB ใช้ jsonb_path_ops เพื่อสร้างดัชนีสำหรับการตรวจการมีค่าอยู่เท่านั้น ซึ่งมีขนาดเล็กและเร็วกว่า:

CREATE INDEX e_data_gin ON events USING GIN (data jsonb_path_ops);
-- Half the size of default jsonb_ops, supports @> only.

ดัชนีผสมแยกตามประเภท

ดัชนีผสมแบบ B-tree ใช้การจับคู่ตามคำนำหน้าด้านซ้าย ดัชนีผสมแบบ GIN ใช้งานได้แต่มีขนาดใหญ่กว่า โดยทั่วไปจึงสร้างดัชนี GIN แยกสำหรับแต่ละคอลัมน์

สรุป

เลือกประเภทดัชนีให้เหมาะกับคำสั่งค้นหา

  • B-tree: ค่าเริ่มต้น
  • GIN: อาร์เรย์/JSONB/ข้อความแบบเต็ม
  • GiST: ช่วง/เรขาคณิต/ข้อความคลุมเครือ
  • BRIN: ตามลำดับ/เพิ่มข้อมูลต่อท้ายเท่านั้น

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

กำลังสร้างดัชนีให้คอลัมน์ TEXT[] สำหรับคำสั่งค้นหาแบบ "มีค่าอยู่" ควรใช้ดัชนีประเภทใด

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

บทเรียน “ดัชนี B-tree เทียบกับ Hash เทียบกับ GiST เทียบกับ GIN” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ดัชนี B-tree เทียบกับ Hash เทียบกับ GiST เทียบกับ GIN”

เปรียบเทียบชนิดดัชนีหลักใน PostgreSQL และเลือกชนิดที่เหมาะสมสำหรับคำสั่งค้นหาแบบเท่ากัน ช่วงข้อมูล รูปทรงเรขาคณิต JSON และการค้นหาข้อความเต็ม คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ดัชนี B-tree เทียบกับ Hash เทียบกับ GiST เทียบกับ GIN” ใช้เวลานานแค่ไหน

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

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

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

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

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