Tốt hơn là tạo một chỉ mục trước khi điền vào bảng với dữ liệu, hay sau khi dữ liệu đã có sẵn?


87

Tôi có một bảng khoảng 100 triệu hàng mà tôi sẽ sao chép để thay đổi, thêm chỉ mục. Tôi không quan tâm lắm đến thời gian tạo bảng mới, nhưng liệu chỉ mục đã tạo có hiệu quả hơn không nếu tôi thay đổi bảng trước khi chèn bất kỳ dữ liệu nào hoặc chèn dữ liệu trước rồi mới thêm chỉ mục?

Câu trả lời:


113

Tạo chỉ mục sau khi chèn dữ liệu là cách hiệu quả hơn (thậm chí thường được khuyến nghị giảm chỉ mục trước khi nhập hàng loạt và sau khi nhập, tạo lại nó).

Ví dụ tổng hợp (PostgreSQL 9.1, máy phát triển chậm, một triệu hàng):

CREATE TABLE test1(id serial, x integer);
INSERT INTO test1(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 7816.561 ms
CREATE INDEX test1_x ON test1 (x);
-- Time: 4183.614 ms

Chèn và sau đó tạo chỉ mục - khoảng 12 giây

CREATE TABLE test2(id serial, x integer);
CREATE INDEX test2_x ON test2 (x);
-- Time: 2.315 ms
INSERT INTO test2(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 25399.460 ms

Tạo chỉ mục và sau đó chèn - khoảng 25,5 giây (chậm hơn hai lần)


5
+1, các chỉ mục sẽ làm chậm rõ rệt một hoạt động liên quan đến tác vụ chèn hàng 100 triệu, vì vậy tốt hơn nên bỏ chúng và tạo lại chúng.
code4life 10/09/10

10

Có lẽ tốt hơn là tạo chỉ mục sau khi các hàng được thêm vào. Nó không chỉ sẽ nhanh hơn, mà còn có thể cân bằng cây sẽ tốt hơn.

Chỉnh sửa "cân bằng" có lẽ không phải là lựa chọn tốt nhất của thuật ngữ ở đây. Trong trường hợp cây b, nó được cân bằng theo định nghĩa. Nhưng điều đó không có nghĩa là b-tree có bố cục tối ưu. Sự phân bố nút con bên trong cha mẹ có thể không đồng đều (dẫn đến nhiều chi phí hơn trong các bản cập nhật trong tương lai) và độ sâu của cây có thể sâu hơn mức cần thiết nếu việc cân bằng không được thực hiện cẩn thận trong quá trình cập nhật. Nếu chỉ mục được tạo sau khi các hàng được thêm vào, thì nhiều khả năng chỉ mục sẽ có phân phối tốt hơn. Ngoài ra, các trang chỉ mục trên đĩa có thể ít bị phân mảnh hơn sau khi chỉ mục được tạo. Thêm một chút thông tin ở đây


2

Điều này không quan trọng về vấn đề này vì:

  1. Nếu bạn thêm dữ liệu đầu tiên vào bảng và sau đó bạn thêm chỉ mục. Thời gian tạo chỉ mục của bạn sẽ O(n*log(N))lâu hơn (khi nmột hàng được thêm vào). Vì thời gian định vị cây là O(N*log(N))khi bạn chia dữ liệu này thành dữ liệu cũ và dữ liệu mới bạn nhận được, O((X+n)*log(N))nó có thể được chuyển đổi đơn giản sang O(X*log(N) + n*log(N))và ở định dạng này, bạn có thể đơn giản xem những gì bạn sẽ chờ bổ sung.
  2. Nếu bạn thêm chỉ mục và sau khi nó đưa dữ liệu. Mỗi hàng (bạn có nhàng mới), bạn sẽ có thêm thời gian O(log(N))cần thiết để tạo lại cấu trúc của cây sau khi thêm phần tử mới vào nó (cột chỉ mục từ hàng mới, vì chỉ mục đã tồn tại và hàng mới đã được thêm vào thì chỉ mục phải được tạo lại để cân bằng cấu trúc, chi phí này O(log(P))ở đâu Plà sức mạnh chỉ mục [các phần tử trong chỉ mục] ). Bạn có nhàng mới thì cuối cùng bạn có n * O(log(N))sau đó O(n*log(N))tóm tắt thêm thời gian.

1

Các chỉ mục được tạo sau đó nhanh hơn nhiều trong hầu hết các trường hợp. Trường hợp điển hình: 20 triệu hàng với văn bản đầy đủ trên varchar (255) - (Tên doanh nghiệp) Chỉ mục tại chỗ trong khi nhập hàng - phù hợp với việc mất tới 20 giây trong trường hợp xấu nhất. Thả chỉ mục và tạo lại - phù hợp với việc mất ít hơn 1 giây mỗi lần


-2

Tôi không chắc nó sẽ thực sự quan trọng vì lợi ích của chỉ mục, vì trong cả hai trường hợp, bạn đang chèn dữ liệu mới vào chỉ mục. Về cơ bản, máy chủ sẽ không biết một chỉ mục sẽ mất cân bằng như thế nào cho đến khi nó được xây dựng. Tốc độ khôn ngoan, rõ ràng, thực hiện các lần chèn mà không có chỉ mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.