ใน MySQL, ประเภทดัชนีเป็น B ต้นไม้และการเข้าถึงองค์ประกอบใน B O(log(n))
ต้นไม้อยู่ในเวลาตัดจำหน่ายลอการิทึม
O(1)
ในทางตรงกันข้ามการเข้าถึงองค์ประกอบในตารางแฮชที่อยู่ใน
เหตุใดจึงไม่ใช้ตารางแฮชแทน b-tree เพื่อเข้าถึงข้อมูลภายในฐานข้อมูล
ใน MySQL, ประเภทดัชนีเป็น B ต้นไม้และการเข้าถึงองค์ประกอบใน B O(log(n))
ต้นไม้อยู่ในเวลาตัดจำหน่ายลอการิทึม
O(1)
ในทางตรงกันข้ามการเข้าถึงองค์ประกอบในตารางแฮชที่อยู่ใน
เหตุใดจึงไม่ใช้ตารางแฮชแทน b-tree เพื่อเข้าถึงข้อมูลภายในฐานข้อมูล
คำตอบ:
คุณสามารถเข้าถึงองค์ประกอบได้ด้วยคีย์หลักในแฮชแท็กเท่านั้น เร็วกว่าการใช้อัลกอริทึมแบบต้นไม้ ( O(1)
แทนที่จะเป็นlog(n)
) แต่คุณไม่สามารถเลือกช่วง ( ทุกอย่างที่อยู่ระหว่างx
และy
) อัลกอริทึมต้นไม้สนับสนุนเรื่องนี้ในขณะที่ดัชนีกัญชาสามารถส่งผลในตารางการสแกนเต็มรูปแบบLog(n)
O(n)
นอกจากนี้ค่าใช้จ่ายคงที่ของดัชนีแฮชมักจะใหญ่กว่า ( ซึ่งไม่มีปัจจัยในสัญกรณ์ทีต้า แต่ก็ยังคงมีอยู่ ) นอกจากนี้อัลกอริทึมของต้นไม้มักจะง่ายต่อการบำรุงรักษาเติบโตด้วยข้อมูลขนาดและอื่น ๆ
ดัชนีแฮชทำงานร่วมกับขนาดแฮชที่กำหนดไว้ล่วงหน้าดังนั้นคุณจึงได้ "ที่เก็บข้อมูล" บางส่วนที่เก็บออบเจ็กต์ไว้ออบเจ็กต์เหล่านี้จะวนซ้ำอีกครั้งเพื่อค้นหาสิ่งที่เหมาะสมภายในพาร์ติชันนี้
ดังนั้นหากคุณมีขนาดเล็กคุณมีค่าใช้จ่ายจำนวนมากสำหรับองค์ประกอบขนาดเล็กขนาดใหญ่จะส่งผลให้มีการสแกนเพิ่มเติม
อัลกอริทึมตารางแฮชในปัจจุบันมักจะปรับขนาด แต่การปรับขนาดอาจไม่มีประสิทธิภาพ
มีอัลกอริทึมการแฮชที่ปรับขนาดได้แน่นอน อย่าถามฉันว่ามันทำงานอย่างไร - มันเป็นเรื่องลึกลับสำหรับฉันเช่นกัน AFAIK วิวัฒนาการมาจากการจำลองแบบที่ปรับขนาดได้ซึ่งการแฮชซ้ำไม่ใช่เรื่องง่าย
เรียกว่าRUSH - R eplication U nder S calable H ashing และอัลกอริทึมเหล่านั้นจึงเรียกว่าอัลกอริทึม RUSH
อย่างไรก็ตามอาจมีจุดที่ดัชนีของคุณเกินขนาดที่ยอมรับได้เมื่อเทียบกับขนาดแฮชของคุณและดัชนีทั้งหมดของคุณจะต้องได้รับการสร้างขึ้นใหม่ โดยปกติแล้วสิ่งนี้ไม่ใช่ปัญหา แต่สำหรับฐานข้อมูลขนาดใหญ่จำนวนมากอาจใช้เวลาหลายวัน
การแลกเปลี่ยนอัลกอริทึมแบบทรีมีขนาดเล็กและเหมาะสำหรับเกือบทุกกรณีการใช้งานจึงเป็นค่าเริ่มต้น
อย่างไรก็ตามหากคุณมีกรณีการใช้งานที่แม่นยำมากและคุณรู้แน่ชัดว่าอะไรคือสิ่งที่จำเป็นเท่านั้นคุณสามารถใช้ประโยชน์จากดัชนีการแฮชได้
อันที่จริงมันก็ดูเหมือนว่า MySQL ใช้ชนิดทั้งของดัชนีทั้งตารางแฮชหรือ B ต้นไม้ตามต่อไปนี้การเชื่อมโยง
ความแตกต่างระหว่างการใช้ b-tree และตารางแฮชคือในอดีตอนุญาตให้คุณใช้การเปรียบเทียบคอลัมน์ในนิพจน์ที่ใช้ตัวดำเนินการ =,>,> =, <, <= หรือ BETWEEN ในขณะที่ตัวหลังใช้สำหรับ การเปรียบเทียบความเท่าเทียมกันที่ใช้ตัวดำเนินการ = หรือ <=>
ความซับซ้อนของเวลาของแฮชแท็กจะคงที่สำหรับแฮชแท็กที่มีขนาดเพียงพอเท่านั้น (จำเป็นต้องมีที่เก็บข้อมูลเพียงพอที่จะเก็บข้อมูล) ไม่ทราบขนาดของตารางฐานข้อมูลล่วงหน้าดังนั้นจึงต้องแฮชตารางใหม่ในตอนนี้จากนั้นจึงจะได้ประสิทธิภาพที่ดีที่สุดจากแฮชแท็ก การทำใหม่ยังมีราคาแพง
ฉันคิดว่าแฮชแมปไม่ได้ปรับขนาดเช่นกันและอาจมีราคาแพงเมื่อต้องปรับเปลี่ยนแผนที่ทั้งหมด
เลือก DB / OS ขึ้นอยู่กับการแฮชและทำงานได้ดี ด้วยหน่วยความจำที่มากขึ้นในปัจจุบันเพื่อรองรับตารางแฮชแบบกระจัดกระจายที่มีประสิทธิภาพและการแฮชซ้ำซ้อนเพื่อรองรับการสืบค้นช่วงที่เรียบง่ายฉันจะบอกว่าการแฮชอาจยังมีที่มา (บางอันก็ค่อนข้างจะมีรูปแบบอื่น ๆ ของการจับคู่ความคล้ายคลึงกันที่ไม่ใช่ช่วงเช่นสัญลักษณ์ตัวแทนและ regexps ). เราขอแนะนำให้คัดลอกเพื่อให้ห่วงโซ่การชนติดกันเมื่อลำดับชั้นของหน่วยความจำมีความเร็วแตกต่างกันมาก