Điều gì xảy ra khi chúng ta thêm một chỉ mục vào một bảng hiện có với một lượng lớn dữ liệu?


11

Tôi có một bảng chứa khoảng ~ 15 triệu bản ghi. Bây giờ tôi cần thêm một chỉ mục vào bảng.

Thêm một chỉ mục sẽ mất một chút thời gian để cập nhật mọi mục trong bảng.

Tôi khá bối rối liệu việc thêm chỉ mục sẽ gây ra thời gian chết.

Nếu có, làm thế nào tôi có thể vượt qua thời gian chết?


Câu trả lời:


10

Với đơn giản CREATE INDEX, bảng sẽ bị khóa để ghi nhưng không đọc.

Sử dụng CREATE INDEX CONCURRENTLYđể tránh khóa viết là tốt.

Từ các tài liệu PostgreSQL trênCREATE INDEX :

Khi tùy chọn này được sử dụng, PostgreSQL sẽ xây dựng chỉ mục mà không cần thực hiện bất kỳ khóa nào ngăn chặn việc chèn, cập nhật hoặc xóa đồng thời trên bảng; trong khi đó một bản dựng chỉ mục tiêu chuẩn khóa ghi (nhưng không đọc) trên bảng cho đến khi hoàn thành. Có một số lưu ý cần lưu ý khi sử dụng tùy chọn này - xem Chỉ mục xây dựng đồng thời .

cụ thể hơn (Like @ypercube đã nhận xét ):

PostgreSQL hỗ trợ xây dựng các chỉ mục mà không khóa ghi . Phương pháp này được gọi bằng cách chỉ định CONCURRENTLYtùy chọn CREATE INDEX. Khi tùy chọn này được sử dụng, PostgreSQL phải thực hiện hai lần quét bảng và ngoài ra, nó phải chờ tất cả các giao dịch hiện tại có khả năng sử dụng chỉ mục để chấm dứt. Do đó phương pháp này đòi hỏi tổng công việc nhiều hơn so với xây dựng chỉ mục tiêu chuẩn và mất nhiều thời gian hơn để hoàn thành. Tuy nhiên, vì nó cho phép các hoạt động bình thường tiếp tục trong khi chỉ mục được xây dựng, phương pháp này rất hữu ích để thêm các chỉ mục mới trong môi trường sản xuất.

Nhấn mạnh đậm của tôi.

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.