B-Tree เทียบกับตารางแฮช


105

ใน MySQL, ประเภทดัชนีเป็น B ต้นไม้และการเข้าถึงองค์ประกอบใน B O(log(n))ต้นไม้อยู่ในเวลาตัดจำหน่ายลอการิทึม

O(1)ในทางตรงกันข้ามการเข้าถึงองค์ประกอบในตารางแฮชที่อยู่ใน

เหตุใดจึงไม่ใช้ตารางแฮชแทน b-tree เพื่อเข้าถึงข้อมูลภายในฐานข้อมูล


9
ตารางแฮชเพื่อไม่รองรับการสืบค้นช่วงและไม่สามารถขยายหรือลดขนาดได้อย่างราบรื่นระหว่างการดำเนินการ
hmakholm ออกจาก Monica

3
@HenningMakholm ทำไมไม่แฮชสำหรับคอลัมน์ที่ไม่ต้องการการสืบค้นช่วง?
Pacerier

คำตอบ:


119

คุณสามารถเข้าถึงองค์ประกอบได้ด้วยคีย์หลักในแฮชแท็กเท่านั้น เร็วกว่าการใช้อัลกอริทึมแบบต้นไม้ ( O(1)แทนที่จะเป็นlog(n) ) แต่คุณไม่สามารถเลือกช่วง ( ทุกอย่างที่อยู่ระหว่างxและy ) อัลกอริทึมต้นไม้สนับสนุนเรื่องนี้ในขณะที่ดัชนีกัญชาสามารถส่งผลในตารางการสแกนเต็มรูปแบบLog(n) O(n)นอกจากนี้ค่าใช้จ่ายคงที่ของดัชนีแฮชมักจะใหญ่กว่า ( ซึ่งไม่มีปัจจัยในสัญกรณ์ทีต้า แต่ก็ยังคงมีอยู่ ) นอกจากนี้อัลกอริทึมของต้นไม้มักจะง่ายต่อการบำรุงรักษาเติบโตด้วยข้อมูลขนาดและอื่น ๆ

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

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

อัลกอริทึมตารางแฮชในปัจจุบันมักจะปรับขนาด แต่การปรับขนาดอาจไม่มีประสิทธิภาพ

มีอัลกอริทึมการแฮชที่ปรับขนาดได้แน่นอน อย่าถามฉันว่ามันทำงานอย่างไร - มันเป็นเรื่องลึกลับสำหรับฉันเช่นกัน AFAIK วิวัฒนาการมาจากการจำลองแบบที่ปรับขนาดได้ซึ่งการแฮชซ้ำไม่ใช่เรื่องง่าย

เรียกว่าRUSH - R eplication U nder S calable H ashing และอัลกอริทึมเหล่านั้นจึงเรียกว่าอัลกอริทึม RUSH

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

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

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


คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับการสร้างดัชนีใหม่ได้หรือไม่? หมายความว่าสำหรับ x วันในขณะที่ดัชนีสร้างใหม่ตารางจะไม่สามารถใช้งานได้ทั้งหมดในช่วงเวลานั้นหรือไม่?
Pacerier

ขึ้นอยู่กับระบบฐานข้อมูลที่ใช้อยู่ คำถามนี้ครอบคลุมเฉพาะกลุ่มเป้าหมายทางทฤษฎีเท่านั้น ฉันไม่รู้จริงๆเกี่ยวกับรายละเอียดการใช้งานระบบฐานข้อมูลทั่วไป แต่โดยปกติแล้วไม่ควรเป็นเช่นนั้นเนื่องจากดัชนีที่สองสามารถสร้างขึ้นได้ในขณะที่ดัชนีแรกยังคงใช้งานอยู่
The Surrican

"คุณสามารถเข้าถึงองค์ประกอบได้ด้วยคีย์หลักเท่านั้น" - คุณหมายถึงค่าของคอลัมน์ที่มีดัชนีถูกต้องไม่ว่าจะเป็นคีย์หลักหรือดัชนีประเภทอื่น?
Mark Fisher

93

อันที่จริงมันก็ดูเหมือนว่า MySQL ใช้ชนิดทั้งของดัชนีทั้งตารางแฮชหรือ B ต้นไม้ตามต่อไปนี้การเชื่อมโยง

ความแตกต่างระหว่างการใช้ b-tree และตารางแฮชคือในอดีตอนุญาตให้คุณใช้การเปรียบเทียบคอลัมน์ในนิพจน์ที่ใช้ตัวดำเนินการ =,>,> =, <, <= หรือ BETWEEN ในขณะที่ตัวหลังใช้สำหรับ การเปรียบเทียบความเท่าเทียมกันที่ใช้ตัวดำเนินการ = หรือ <=>


12
มันไม่ยุติธรรม คำตอบที่ดีที่สุดมีคะแนนต่ำสุด
АндрейБеньковский

7
นี่คือสิ่งที่ฉันกำลังมองหา ฉันสนใจว่าจะมีผลต่อการค้นหาของฉันอย่างไรมากกว่าการวิเคราะห์ทางเทคนิค
Ben Dehghan

อ๋อ! คำตอบนี้ช่วยฉันได้มากที่สุด
Ron Ross

ขอบคุณมากเป็นเวลานาน แต่คำตอบนี้ช่วยฉันได้มากเช่นกัน
Reham Fahmy

14

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


2
สามารถทำการเปลี่ยนใหม่ในขณะที่ฐานข้อมูลออนไลน์อยู่ได้หรือไม่ หรือเราต้องล็อคโต๊ะเพื่อทำใหม่ทุกอย่าง?
Pacerier

1
Pacerier, MySQL ไม่รองรับดัชนีแฮช เป็นไปได้ในทางทฤษฎีที่จะทำการ rehash ดัชนีในขณะที่ฐานข้อมูลยังคงออนไลน์อยู่ (ใช้ดัชนีเก่าต่อไปสร้างดัชนีใหม่สลับไปยังดัชนีใหม่เมื่อเสร็จสิ้น) แต่ฉันไม่รู้ว่า MySQL จะทำอย่างไรหากนำไปใช้ แฮชบ่งชี้
Emil Vikström

3
MySQL รองรับดัชนีแฮชใช่ไหม : dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
Pacerier

คุณดูเหมือนจะถูกต้อง นั่นเป็นข่าวกับฉัน! ฉันต้องพยายามพัฒนาให้ทัน :-) ถ้าอย่างนั้นคุณก็ตอบคำถามของคุณได้ดีกว่าฉันมาก แต่อย่างที่บอก: มันเป็นไปได้ในทางทฤษฎี
Emil Vikström

ทำไมคุณถึงบอกว่า "btree สามารถเพจออกไปยังดิสก์ได้อย่างง่ายดาย แต่แฮชแท็กไม่สามารถทำได้"? ไม่สามารถจัดเก็บแฮชแท็กในดิสก์ได้เนื่องจากการค้นหาคีย์อย่างง่ายจะเพียงพอหรือไม่?
Pacerier


0

เลือก DB / OS ขึ้นอยู่กับการแฮชและทำงานได้ดี ด้วยหน่วยความจำที่มากขึ้นในปัจจุบันเพื่อรองรับตารางแฮชแบบกระจัดกระจายที่มีประสิทธิภาพและการแฮชซ้ำซ้อนเพื่อรองรับการสืบค้นช่วงที่เรียบง่ายฉันจะบอกว่าการแฮชอาจยังมีที่มา (บางอันก็ค่อนข้างจะมีรูปแบบอื่น ๆ ของการจับคู่ความคล้ายคลึงกันที่ไม่ใช่ช่วงเช่นสัญลักษณ์ตัวแทนและ regexps ). เราขอแนะนำให้คัดลอกเพื่อให้ห่วงโซ่การชนติดกันเมื่อลำดับชั้นของหน่วยความจำมีความเร็วแตกต่างกันมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.