2011-09-05 27 views
62

Trong MySQL, một loại chỉ mục là một cây b, và truy cập một phần tử trong một cây b là trong thời gian phân bổ logarit O(log(n)).B-Tree vs Hash Bảng

Mặt khác, việc truy cập phần tử trong bảng băm là O(1).

Tại sao bảng băm không được sử dụng thay cho cây b để truy cập dữ liệu bên trong cơ sở dữ liệu?

+6

băm bảng để không hỗ trợ các truy vấn phạm vi và không thể phát triển hoặc thu gọn suốt trong quá trình hoạt động. –

+1

@HenningMakholm Tại sao không băm cho các cột không cần truy vấn phạm vi? – Pacerier

Trả lời

62

Bạn chỉ có thể truy cập các yếu tố bằng khóa chính của chúng trong một thẻ bắt đầu bằng #. Đây là nhanh hơn so với một thuật toán cây (O(1) thay vì log(n)), nhưng bạn không thể chọn dãy (tất cả mọi thứ ở giữa xy). Thuật toán cây hỗ trợ điều này trong Log(n) trong trường hợp chỉ mục băm có thể dẫn đến quét toàn bộ bảng O(n). Ngoài ra chi phí liên tục của các chỉ mục băm thường lớn hơn (không có yếu tố trong ký hiệu theta, nhưng nó vẫn tồn tại). Ngoài ra thuật toán cây thường dễ bảo trì hơn, phát triển với dữ liệu, tỷ lệ, v.v.

Chỉ mục băm làm việc với kích thước băm được xác định trước, vì vậy bạn kết thúc với một số "nhóm" nơi đối tượng được lưu trữ. được lặp lại để thực sự tìm thấy đúng bên trong phân vùng này.

Vì vậy, nếu bạn có kích thước nhỏ, bạn có rất nhiều chi phí cho các yếu tố nhỏ, kích thước lớn dẫn đến quét thêm.

Thuật toán bảng băm diễn ra thường là tỷ lệ, nhưng tỷ lệ có thể không hiệu quả.

Thực sự có các thuật toán băm có thể mở rộng. Đừng hỏi tôi làm thế nào điều đó hoạt động - đó là một điều vô cùng với tôi. AFAIK chúng phát triển từ nhân rộng có thể mở rộng, nơi việc băm lại không dễ dàng.

của nó được gọi là RUSH - R eplication U nder S calable H tro, và do đó những thuật toán được gọi là thuật toán RUSH.

Tuy nhiên, có thể có một điểm mà chỉ mục của bạn vượt quá kích thước có thể chấp nhận được so với kích thước băm và toàn bộ chỉ mục của bạn cần được xây dựng lại. Thông thường đây không phải là một vấn đề, nhưng đối với cơ sở dữ liệu khổng lồ lớn, điều này có thể mất vài ngày.

Việc trao đổi thuật toán cây nhỏ và chúng phù hợp cho hầu hết mọi trường hợp sử dụng và do đó là mặc định.

Tuy nhiên nếu bạn có trường hợp sử dụng rất chính xác và bạn biết chính xác điều gì và chỉ những gì sẽ cần, bạn có thể tận dụng các chỉ mục băm.

+0

Bạn có thể giải thích thêm về chỉ số xây dựng lại không? Điều đó có nghĩa là trong x ngày trong khi chỉ số xây dựng lại, bảng hoàn toàn không có sẵn để sử dụng trong khoảng thời gian đó? – Pacerier

+0

phụ thuộc vào hệ thống cơ sở dữ liệu đang sử dụng. câu hỏi chỉ bao gồm các aspecsts lý thuyết. tôi không thực sự biết về các chi tiết thực hiện của các hệ thống cơ sở dữ liệu phổ biến. nhưng thường không phải là trường hợp này vì chỉ mục thứ hai có thể được xây dựng trong khi chỉ mục đầu tiên vẫn đang được sử dụng –

13

Độ phức tạp về thời gian của hashtables chỉ liên tục cho các thẻ bắt đầu có kích thước đủ (có đủ nhóm để giữ dữ liệu). Kích thước của một bảng cơ sở dữ liệu không được biết trước nên bảng phải được phục hồi ngay bây giờ và sau đó để có được hiệu suất tối ưu từ một hashtable. Việc phục hồi cũng đắt tiền.

+2

Có thể khôi phục lại được thực hiện trong khi db đang trực tuyến không? Hay chúng ta phải khóa bàn để phục hồi tất cả mọi thứ? – Pacerier

+1

Pacerier, MySQL không hỗ trợ chỉ mục băm. Về mặt lý thuyết có thể khôi phục chỉ mục trong khi cơ sở dữ liệu vẫn trực tuyến (tiếp tục sử dụng chỉ mục cũ, tạo chỉ mục mới, chuyển sang chỉ mục mới khi được thực hiện) nhưng tôi không biết MySQL sẽ làm gì nếu chúng thực hiện chỉ báo băm. –

+3

MySQL hỗ trợ chỉ mục băm đúng không? : http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html – Pacerier

5

Tôi nghĩ rằng Hashmaps cũng không mở rộng quy mô và có thể tốn kém khi toàn bộ bản đồ cần được phục hồi.

23

Thực ra, có vẻ như MySQL sử dụng cả hai loại chỉ mục hoặc bảng băm hoặc cây b theo sau link.

Sự khác biệt giữa việc sử dụng một b-tree và một bảng băm là cựu phép bạn sử dụng so sánh cột trong các biểu thức mà sử dụng =,>,> =, <, < =, hoặc GIỮA nhà khai thác, trong khi cái sau chỉ được sử dụng chỉ để so sánh bình đẳng sử dụng toán tử = hoặc < =>.

+5

Đó là không công bằng. Câu trả lời hay nhất có điểm thấp nhất. –

+3

Đây chính xác là những gì tôi đang tìm kiếm. Tôi quan tâm đến cách nó ảnh hưởng đến các truy vấn của tôi hơn là phân tích kỹ thuật. –