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