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