ฉันจะจัดทำดัชนี UUID ใน Postgres ได้อย่างไร


26

ฉันใหม่กับ PostgreSQL และค่อนข้างใหม่สำหรับฐานข้อมูลโดยทั่วไป มีวิธีที่กำหนดไว้ว่าเราควรทำดัชนีค่าUUIDใน Postgres หรือไม่? ฉันแยกระหว่างการใช้การแฮชและการใช้คู่กรณีเว้นแต่ว่ามีบางอย่างในตัวที่ใช้โดยอัตโนมัติ สิ่งที่ฉันใช้คือการจัดการข้อมูลจำนวนมหาศาล

ดัชนี "text_ops" ตระกูลโอเปอเรเตอร์ SP-GiST ใช้ trie เนื่องจาก UUID นั้นค่อนข้างยาวและแตกต่างกันมากเสียงเหล่านี้น่าดึงดูดแม้ว่าฉันจะทำการค้นหาแบบเต็มเท่านั้น

นอกจากนี้ยังมีตัวเลือกแฮช Hashing คือ O (1) และฉันไม่จำเป็นต้องทำการเปรียบเทียบใด ๆ นอกเหนือจากความเท่าเทียมกันแน่นอน แต่เนื่องจาก UUID ค่อนข้างยาวฉันกลัวว่าการสร้างแฮชจากพวกเขาจะเสียเวลามาก

หรือสิ่งนี้ขึ้นอยู่กับระบบมากเกินไปและใช้เฉพาะหรือไม่

ฉันควรใช้bigserialในกรณีส่วนใหญ่ แต่ฉันถูกบอกให้ใช้uuidสำหรับเรื่องนี้ เราต้องการuuidเพราะเราอาจมีเซิร์ฟเวอร์หลายเครื่องที่ใช้ฐานข้อมูลที่แตกต่างกันดังนั้นจึงไม่มีการรับประกันว่าเราจะมี bigint ที่ไม่ซ้ำกัน เราสามารถใช้ลำดับที่แตกต่างกัน (และ seed) สำหรับแต่ละเซิร์ฟเวอร์ แต่ก็ยังไม่ยืดหยุ่นเท่ากับ UUID ตัวอย่างเช่นเราจะไม่สามารถโยกย้ายรายการฐานข้อมูลจากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่นโดยไม่ต้องแปลง ID และการอ้างอิงของพวกเขาทุกที่


2
ฉันเชื่อว่า"ฐานข้อมูลส่วนกลาง"เป็นคำศัพท์สำหรับสถานการณ์ของคุณ และใช่ UUIDs เป็นทางออกสำหรับสิ่งนั้น นั่นคือเหตุผลที่ UUIDs ถูกประดิษฐ์ขึ้นเมื่อหลายสิบปีก่อน: สำหรับการแบ่งปันข้อมูลระหว่างระบบกระจายโดยไม่มีการประสานงานจากส่วนกลาง
Basil Bourque

หลายเดือนต่อมา: แท้จริงแล้วฐานข้อมูล "federated" ที่ Basil Bourque นำมาใช้คือสิ่งที่เรากำลังจะทำ ไม่เพียง แต่เรามีเซิร์ฟเวอร์หลายเครื่อง แต่เรามีลูกค้า (ซึ่งอาจคิดว่าเป็นส่วนหนึ่งของฐานข้อมูลรวม) สร้าง ID ในขณะออฟไลน์เช่นกัน นั่นเป็นเหตุผลที่เราใช้ UUID
sudo

คำตอบ:


31

ใช้uuidชนิดข้อมูลในตัวของ PostgreSQL และสร้างดัชนี b-tree เป็นประจำ

ไม่จำเป็นต้องทำอะไรเป็นพิเศษ สิ่งนี้จะส่งผลให้ดัชนีที่ดีที่สุดและจะเก็บuuidเขตข้อมูลไว้ในรูปแบบกะทัดรัดเช่นเดียวกับที่ใช้งานจริง

(ดัชนีแฮชใน PostgreSQL ก่อนเวอร์ชัน 10 นั้นไม่ได้เกิดความผิดพลาดที่ปลอดภัยและเป็นของที่ระลึกทางประวัติศาสตร์ที่มีแนวโน้มที่จะทำงานได้ไม่ดีกว่าต้นไม้ b-tree ต่อไปหลีกเลี่ยงพวกมันใน PostgreSQL 10 พวกเขาได้ทำ มีการปรับปรุงประสิทธิภาพเพื่อให้คุณอาจต้องการพิจารณา)

หากด้วยเหตุผลบางอย่างที่คุณไม่สามารถใช้uuidประเภทนี้ได้โดยทั่วไปคุณจะสร้าง b-tree บนการแสดงข้อความหรือโดยเฉพาะอย่างยิ่งการเป็นbyteaตัวแทนของ uuid


2
ในขณะที่คำแถลงเกี่ยวกับhashดัชนีเมื่อเทียบกับb-treeความเชื่อที่จัดขึ้นโดยทั่วไปฉันคิดว่ามันจะเป็นประโยชน์ในการอ้างอิงแหล่งที่มาสำหรับการเรียกร้องดังกล่าว
Volte

1
ตั้งแต่ PostgreSQL 10 hashตอนนี้ดัชนีปลอดภัยแล้ว ที่กล่าวว่าhashดัชนีสามารถใช้ได้กับ=ดังนั้นหากคุณต้องการผู้ประกอบการอื่น ๆb-treeยังคงเป็นที่นิยม
rintaun

1
สองสามปีต่อมาในประสบการณ์ของฉันhashไม่ได้เร็วกว่าb-treeมากแม้แต่ใน Postgres 10 แต่เนื่องจากดัชนีแฮชใช้พื้นที่ดิสก์น้อยกว่าต้นไม้ b จึงอาจเร็วขึ้นในการตั้งค่าที่ดัชนีขนาดใหญ่กลายเป็น ปัญหาที่ฉันรู้สึกว่าไม่เป็นเช่นนั้นสำหรับฉัน ทีนี้ฉันจะจับตาดูว่าตอนนี้ฉันสามารถใช้พวกเขาอย่างปลอดภัยใน v10 แล้ว
sudo

มีอัพการเขียนที่ดีเกี่ยวกับการปรับปรุงแฮชดัชนีอย่างสมบูรณ์ใน v10 และ v11: rhaas.blogspot.com/2017/09/ … - amitkapila16.blogspot.com/2017/03/ …
เกล็นมอร์ตัน

3

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

http://www.postgresql.org/message-id/4407.1115698257@sss.pgh.pa.us


ใช่ฉันได้รับคำเตือนเมื่อฉันพยายามใช้ดัชนีแฮช "ท้อแท้อย่างยิ่ง" หรืออะไรบางอย่าง
sudo

ดัชนีแฮชทำงานได้ดีใน PostgreSQL ภายใต้สถานการณ์บางอย่าง แต่เมื่อเร็ว ๆ นี้ฉันพบว่าพวกเขาทำให้แบบสอบถามของฉันกลับไม่มีผลลัพธ์เมื่อฉันพยายามเพิ่มประสิทธิภาพด้วยดัชนีแฮชบนคีย์หลัก UUID ชนิดข้อมูล & คีย์ต่างประเทศ มีประโยชน์อย่างมากต่อดัชนีแฮชหากใช้กับข้อมูลทุกประเภทเท่านั้นและ PostgreSQL devs รู้สิ่งนี้พวกเขาขี้เกียจเกินกว่าที่จะแก้ไขมันเองและพวกเขาก็เก็บรหัสของพวกเขาราวกับว่าพวกเขากำลังสวดอ้อนวอนเพื่อ ผู้กอบกู้
derekm

2
มีคนช่วยดัชนีแฮชฉันเดาว่าเพราะพวกเขามีบทบาทสำคัญในการแบ่งพาร์ติชันข้อมูลซึ่ง Pg10 มุ่งเน้นไปที่: wiki.postgresql.org/wiki/แต่พวกเขาก็ยังไม่ได้ให้ทุกสิ่งที่ฉันเห็นในทางทฤษฎี มีประโยชน์ในชั้นเรียนฐานข้อมูลวิทยาลัย)
sudo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.