CodeGym /Các khóa học /SQL SELF /Xóa và thay đổi index: DROP INDEX, R...

Xóa và thay đổi index: DROP INDEX, REINDEX

SQL SELF
Mức độ , Bài học
Có sẵn

Việc xóa hoặc thay đổi index trong PostgreSQL có thể cần thiết trong một số trường hợp:

  • Thừa index: Nếu tụi mình tạo quá nhiều index mà không còn dùng nữa, nó có thể làm chậm các thao tác ghi như INSERT, UPDATEDELETE.
  • Index bị lỗi: Đôi khi index có thể bị lỗi, nhất là sau khi hệ thống bị crash hoặc PostgreSQL bị tắt không đúng cách.
  • Tối ưu hóa: Bạn phát hiện ra có loại index khác phù hợp hơn cho query của mình và muốn thay thế index hiện tại.
  • Thay đổi cấu trúc bảng: Khi bạn thêm hoặc xóa cột trong bảng, các index phụ thuộc vào cột đó có thể không còn phù hợp nữa.

Bây giờ tụi mình sẽ xem cách làm việc với các lệnh DROP INDEXREINDEX để quản lý index.

Xóa index bằng DROP INDEX

Lệnh DROP INDEX dùng để xóa index khỏi database của bạn. Đây là cú pháp chung:

DROP INDEX [ IF EXISTS ] index_name [ CASCADE ];

Giải thích kỹ hơn nè:

  • IF EXISTS: tuỳ chọn này giúp tránh lỗi nếu index với tên chỉ định không tồn tại. PostgreSQL chỉ cảnh báo thôi.
  • index_name: tên index bạn muốn xóa.
  • CASCADE: chỉ định rằng tất cả các object liên quan đến index cũng sẽ bị xóa. Cái này ít dùng vì index thường không có phụ thuộc.

Ví dụ 1: Xóa index đơn giản

Giả sử tụi mình có bảng students với index trên trường email. Giờ không cần index này nữa, tụi mình xóa như sau:

DROP INDEX idx_students_email;

Ở đây idx_students_email là tên index. Sau khi chạy lệnh này, index sẽ bị xóa khỏi database.

Ví dụ 2: Xóa index với kiểm tra tồn tại

Nếu bạn không chắc index có tồn tại không, hãy dùng tuỳ chọn IF EXISTS:

DROP INDEX IF EXISTS idx_students_email;

Nếu index không tồn tại, PostgreSQL sẽ không báo lỗi — chỉ cảnh báo thôi.

Ví dụ 3: Thử xóa object phụ thuộc (CASCADE)

Giả sử có index liên quan đến một constraint nào đó. Ví dụ, index unique được tạo tự động cho constraint UNIQUE. Nếu bạn thử xóa index này, PostgreSQL sẽ không cho xóa trừ khi bạn dùng CASCADE:

DROP INDEX idx_students_email CASCADE;

Lưu ý là nên cẩn thận với cách này nha. Đừng vội xóa kiểu cascade nếu chưa chắc về hậu quả.

Thay đổi index bằng REINDEX

Lệnh REINDEX dùng để phục hồi index nếu nó bị lỗi hoặc đã cũ. Điều này có thể xảy ra do lỗi hệ thống file, database crash hoặc chỉ đơn giản là dùng lâu ngày.

Cú pháp cơ bản

REINDEX { INDEX | TABLE | SCHEMA | DATABASE } name;

Giải thích các tuỳ chọn:

  • INDEX: phục hồi một index cụ thể.
  • TABLE: phục hồi tất cả index của bảng chỉ định.
  • SCHEMA: phục hồi index cho tất cả bảng trong schema chỉ định.
  • DATABASE: phục hồi tất cả index trong database hiện tại.

Ví dụ 1: Phục hồi một index cụ thể

Nếu bạn thấy index idx_students_email chạy chậm, bạn có thể phục hồi nó:

REINDEX INDEX idx_students_email;

Ví dụ 2: Phục hồi tất cả index của bảng

Nếu nghi ngờ bảng students bị chậm do index lỗi, hãy phục hồi tất cả index của nó:

REINDEX TABLE students;

Ví dụ 3: Phục hồi index toàn bộ database

Khi hệ thống bị crash, index toàn database có thể bị lỗi. Đây là cách phục hồi:

REINDEX DATABASE university;

Lưu ý: Để chạy lệnh này bạn cần quyền superuser nha.

Tips khi làm việc với DROP INDEXREINDEX

Luôn dùng IF EXISTS để tránh lỗi, nhất là khi tự động hóa phức tạp.

Trước khi xóa index, hãy kiểm tra xem nó có thực sự không dùng nữa không. Chạy query để xem index có đang được dùng không:

SELECT *
FROM pg_stat_user_indexes 
WHERE indexrelname = 'idx_students_email';

Cẩn thận với tham số CASCADE nha! Đôi khi các constraint hoặc object phụ thuộc rất quan trọng cho tính toàn vẹn dữ liệu.

Dùng REINDEX để bảo trì database định kỳ. Đặc biệt hữu ích cho bảng thay đổi thường xuyên hoặc khi làm việc với dữ liệu lớn.

Có thể gặp lỗi gì?

Xóa hoặc thay đổi index có thể gặp một số lỗi phổ biến.

Thử xóa index không tồn tại. Nếu không dùng IF EXISTS, PostgreSQL sẽ báo lỗi:

ERROR:  index "idx_nonexistent" does not exist

Xóa index hệ thống. Nếu lỡ tay xóa index hệ thống, có thể gây thảm họa. Ví dụ, các cột quan trọng như khoá chính (primary key) có index liên quan. Không thể xóa trực tiếp, PostgreSQL sẽ yêu cầu xóa qua ALTER TABLE DROP CONSTRAINT.

Khoá bảng. Một số thao tác với DROP INDEX hoặc REINDEX có thể khoá bảng, nhất là khi có query khác đang chạy song song. Nếu không muốn bị khoá, hãy cân nhắc tạo index với tham số CONCURRENTLY thay vì REINDEX.

Ứng dụng thực tế

Tối ưu hóa query: nếu phát hiện index không còn dùng nữa, hãy xóa để giải phóng tài nguyên database.

Dọn dẹp index: trong quá trình phát triển có thể xuất hiện các index "rác" do thử nghiệm. Hãy thường xuyên xóa index không cần thiết.

Duy trì hiệu suất: dùng REINDEX để phục hồi index, giúp chúng chạy nhanh và ổn định.

Với những công cụ này, giờ bạn không chỉ tạo mà còn quản lý index hiệu quả trong PostgreSQL. Đây là bước quan trọng để tối ưu database và đảm bảo hiệu suất. Nhớ giữ index gọn gàng nha!

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION