SQL Academy · บทเรียน

ดัชนีเชิงพื้นที่ (GiST)

ทำให้คำค้นหาตำแหน่งทำงานได้รวดเร็ว

บทเรียน 4 จาก 413 ขั้นตอน

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

เหตุใดการสืบค้นตำแหน่งจึงช้าลง

ลองจินตนาการถึงตารางที่มีตำแหน่งร้านอาหารหลายล้านแห่ง หากคุณถามว่า "ค้นหาร้านอาหารทั้งหมดที่อยู่ภายในระยะ 5 กิโลเมตรจากฉัน" ฐานข้อมูลจะต้องคำนวณระยะห่างของทุกแถว นี่เรียกว่าการ สแกนตามลำดับ และจะช้าลงอย่างมากเมื่อตารางมีขนาดใหญ่ขึ้น

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

ดัชนี GiST คืออะไร

GiST ย่อมาจาก ต้นไม้ค้นหาแบบทั่วไป เป็นโครงสร้างสำหรับดัชนีที่ยืดหยุ่นซึ่งมีอยู่ใน PostgreSQL และรองรับชนิดข้อมูลมากมาย รวมถึงรูปร่างเรขาคณิตและเรขาคณิตของ PostGIS

แตกต่างจากดัชนีแบบ B-tree ซึ่งทำงานกับค่าที่จัดเรียงได้ เช่น จำนวนเต็มหรือสตริง GiST สามารถสร้างดัชนีให้ข้อมูลหลายมิติ เช่น จุด โพลิกอน และเส้นได้ โดย PostGIS ใช้ GiST ภายในเพื่อสร้างดัชนีเชิงพื้นที่

การสร้างดัชนีเชิงพื้นที่

การสร้างดัชนี GiST บนคอลัมน์เรขาคณิตทำได้ไม่ซับซ้อน โดยใช้ CREATE INDEX ร่วมกับส่วนคำสั่ง USING gist คำสั่งเดียวนี้สามารถเปลี่ยนเวลาทำงานของคำสืบค้นจากหลายนาทีให้เหลือเพียงมิลลิวินาที

CREATE INDEX idx_restaurants_geom
  ON restaurants
  USING gist (geom);

วิธีทำงานของ GiST: กรอบขอบเขต

ดัชนีเชิงพื้นที่ GiST ไม่ได้เก็บเรขาคณิตที่แม่นยำทั้งหมด แต่เก็บ กรอบขอบเขต ซึ่งเป็นสี่เหลี่ยมผืนผ้าที่เล็กที่สุดที่ล้อมเรขาคณิตแต่ละชุดไว้ ต้นไม้จะถูกสร้างขึ้นโดยจัดกลุ่มกรอบขอบเขตที่อยู่ใกล้กันในแต่ละระดับ

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

การตั้งค่าตารางตัวอย่าง

ก่อนสำรวจการทำงานของดัชนี เรามาสร้างตารางตัวอย่างสำหรับจุดเมืองและใส่ข้อมูลลงไปสองสามแถว คอลัมน์ geom จะเก็บเมืองแต่ละแห่งเป็นจุดใน WGS 84 (SRID 4326)

CREATE TABLE cities (
  id   SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  geom GEOMETRY(Point, 4326)
);

INSERT INTO cities (name, geom) VALUES
  ('Paris',    ST_SetSRID(ST_MakePoint(2.3522,  48.8566), 4326)),
  ('Berlin',   ST_SetSRID(ST_MakePoint(13.4050, 52.5200), 4326)),
  ('Madrid',   ST_SetSRID(ST_MakePoint(-3.7038, 40.4168), 4326)),
  ('Rome',     ST_SetSRID(ST_MakePoint(12.4964, 41.9028), 4326)),
  ('Warsaw',   ST_SetSRID(ST_MakePoint(21.0122, 52.2297), 4326));

การเพิ่มดัชนี GiST

เมื่อตารางมีข้อมูลแล้ว ให้เพิ่มดัชนี GiST บนคอลัมน์ geom สำหรับตารางใช้งานจริงที่มีหลายล้านแถว คำสั่งนี้อาจใช้เวลาสองสามนาที แต่จำเป็นต้องเรียกใช้เพียงครั้งเดียว หลังจากนั้นคำสืบค้นเชิงพื้นที่ทุกครั้งที่ใช้คอลัมน์นี้จะได้รับประโยชน์จากดัชนีโดยอัตโนมัติ

CREATE INDEX idx_cities_geom
  ON cities
  USING gist (geom);

-- Verify the index exists
SELECT indexname, indexdef
FROM   pg_indexes
WHERE  tablename = 'cities';

ตัวดำเนินการกรอบขอบเขต &&

PostGIS มีตัวดำเนินการ && สำหรับทดสอบว่ากรอบขอบเขตสองชุดทับซ้อนกันหรือไม่ ตัวดำเนินการนี้รองรับการใช้ดัชนี โดยตัววางแผนจะใช้ดัชนี GiST โดยอัตโนมัติ จึงทำงานได้เร็วกว่าการคำนวณจุดตัดของเรขาคณิตที่แม่นยำ และมักใช้เป็นตัวกรองล่วงหน้าอย่างรวดเร็ว

-- Find cities whose bounding box overlaps a search rectangle
SELECT name
FROM   cities
WHERE  geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);

การค้นหาเพื่อนบ้านที่ใกล้ที่สุดด้วย <->

ตัวดำเนินการ <-> จะคืนค่าระยะห่างระหว่างเรขาคณิตสองชุด และได้รับการเร่งความเร็วด้วย GiST เช่นกัน การใช้ตัวดำเนินการนี้ร่วมกับ ORDER BY ... LIMIT จะทำให้ได้คำสืบค้นแบบเพื่อนบ้านที่ใกล้ที่สุดจำนวน k รายการ (KNN)ที่รวดเร็วมาก โดยไม่จำเป็นต้องสแกนทั้งตาราง

-- Find the 3 cities closest to a reference point (Brussels)
SELECT name,
       ST_Distance(
         geom::geography,
         ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)::geography
       ) / 1000 AS distance_km
FROM   cities
ORDER BY geom <-> ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)
LIMIT  3;

การตรวจสอบการใช้ดัชนีด้วย EXPLAIN

ควรใช้ EXPLAIN หรือ EXPLAIN ANALYZE เสมอเพื่อยืนยันว่าตัววางแผนใช้ดัชนีของคุณจริงหรือไม่ โปรดมองหาการสแกนดัชนีแบบบิตแมป หรือการสแกนโดยใช้ดัชนี idx_cities_geomในผลลัพธ์ หากพบการสแกนตามลำดับแทน ตารางอาจมีขนาดเล็กเกินกว่าที่ตัววางแผนจะเลือกใช้ดัชนี

EXPLAIN
SELECT name
FROM   cities
WHERE  geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);

การสร้างดัชนีพร้อมกัน

การสร้างดัชนีเชิงพื้นที่ขนาดใหญ่ด้วยคำสั่ง CREATE INDEX มาตรฐานจะล็อกตารางไม่ให้เขียนข้อมูล ในระบบใช้งานจริง ให้ใช้ CREATE INDEX CONCURRENTLY เพื่อสร้างดัชนีโดยไม่ขัดขวางการแทรกหรือการปรับปรุงข้อมูล ข้อแลกเปลี่ยนคือคำสั่งนี้ใช้เวลานานกว่า และไม่สามารถเรียกใช้ภายในบล็อกธุรกรรมได้

-- Safe for production tables (no write lock)
CREATE INDEX CONCURRENTLY idx_restaurants_geom
  ON restaurants
  USING gist (geom);

การบำรุงรักษาดัชนีเชิงพื้นที่

เมื่อเวลาผ่านไป การแทรก การปรับปรุง และการลบข้อมูลจำนวนมากอาจทำให้เกิดดัชนีบวม กล่าวคือ ดัชนีจะแตกเป็นส่วน ๆ และมีประสิทธิภาพลดลง ใช้ REINDEX เพื่อสร้างดัชนีใหม่ให้เป็นระเบียบ หรือกำหนดเวลาเรียกใช้ VACUUM ANALYZE เป็นระยะเพื่อปรับปรุงสถิติ ทำให้ตัววางแผนการสืบค้นตัดสินใจได้ดียิ่งขึ้น

-- Rebuild the index to remove bloat
REINDEX INDEX idx_cities_geom;

-- Update planner statistics for the table
ANALYZE cities;

ตรวจสอบความเข้าใจ: ดัชนี GiST

ทดสอบความเข้าใจเกี่ยวกับดัชนีเชิงพื้นที่ด้วย GiST ใน PostGIS

ทบทวน: ดัชนีเชิงพื้นที่ด้วย GiST

ในบทเรียนนี้ คุณได้เรียนรู้ว่าเหตุใดดัชนีเชิงพื้นที่จึงมีความสำคัญต่อคำสืบค้นตำแหน่งที่มีประสิทธิภาพ และ GiST ทำให้สิ่งนี้เป็นไปได้อย่างไรใน PostgreSQL และ PostGIS

ประเด็นสำคัญ:

  • GiST (ต้นไม้ค้นหาแบบทั่วไป) เป็นชนิดดัชนีที่ยืดหยุ่นและรองรับข้อมูลเรขาคณิตหลายมิติ
  • สร้างดัชนีเชิงพื้นที่ด้วย CREATE INDEX ... USING gist (geom)
  • GiST เก็บกรอบขอบเขตและตัดกิ่งจากต้นไม้ค้นหา จึงไม่ต้องสแกนทั้งตาราง
  • ตัวดำเนินการ && (การทับซ้อนของกรอบขอบเขต) และตัวดำเนินการ <-> (ระยะห่าง/KNN) ต่างก็ได้รับการเร่งความเร็วด้วย GiST
  • ใช้ EXPLAIN เพื่อตรวจสอบการใช้ดัชนี และใช้ CREATE INDEX CONCURRENTLY ในระบบใช้งานจริงเพื่อหลีกเลี่ยงการล็อกการเขียนข้อมูล
  • บำรุงรักษาดัชนีด้วย REINDEX และ ANALYZE เพื่อให้คำสืบค้นยังคงรวดเร็วเมื่อเวลาผ่านไป
เริ่มต้นได้ฟรี

เรียนรู้ SQL ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
46
บทเรียน
183

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

บทเรียน “ดัชนีเชิงพื้นที่ (GiST)” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ดัชนีเชิงพื้นที่ (GiST)”

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

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

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

บทเรียน “ดัชนีเชิงพื้นที่ (GiST)” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ชนิดข้อมูลเชิงพื้นที่
  2. ระยะทางและเพื่อนบ้านที่ใกล้ที่สุด
  3. การเชื่อมตารางเชิงพื้นที่และการตรวจสอบการครอบคลุม
  4. ดัชนีเชิงพื้นที่ (GiST)
← กลับไปที่ SQL Academy