Công nghệ - 22/06/2025 00:07:46
Đừng để "Index" trở thành gánh nặng cho database!
Trong nỗ lực tối ưu performance, nhiều dev team đã "spam index" với kỳ vọng mọi thứ sẽ nhanh hơn. Nhưng nếu không đi kèm chiến lược , cái giá phải trả là: ghi chậm, database phình to, hệ thống càng trì trệ hơn chứ không phải nhanh hơn.
Trong quá trình tối ưu hiệu năng hệ thống, nhiều đội ngũ phát triển thường mắc phải một sai lầm khá phổ biến: đánh index tràn lan với hy vọng mọi truy vấn sẽ nhanh hơn. Tuy nhiên, thực tế lại cho thấy, việc lạm dụng index mà không có chiến lược, không có partition phù hợp có thể khiến hệ thống chậm đi, tốn tài nguyên và khó bảo trì.
Bài viết này sẽ phân tích nguyên nhân, tác hại và đề xuất các phương án xử lý, cùng ưu nhược điểm của từng giải pháp.
Partition là kỹ thuật phân chia dữ liệu lớn thành các phân vùng nhỏ hơn, giúp:
Khi chỉ đánh index mà không partition, index vẫn phải bao phủ toàn bộ bảng lớn, dẫn đến hiệu quả thấp. Partition kết hợp với index giúp index nhỏ gọn, truy vấn nhanh hơn và bảo trì dễ dàng hơn.
1. Số lượng index trên một bảng quá nhiều, nhiều index trùng lặp hoặc gần giống nhau
Nếu bạn thấy một bảng có nhiều index trên các cột riêng lẻ hoặc các tổ hợp cột gần giống nhau, đây là dấu hiệu điển hình của over-indexing. Đặc biệt, các index chỉ khác nhau về thứ tự cột hoặc có cùng chức năng nhưng tên khác nhau.
2. Hiệu năng thao tác ghi (INSERT/UPDATE/DELETE) giảm mạnh
Khi mỗi thao tác ghi đều phải cập nhật tất cả các index liên quan, hệ thống sẽ bị chậm lại rõ rệt, nhất là với các bảng write-heavy (có nhiều thao tác ghi)
3. Dung lượng database tăng nhanh bất thường
Index chiếm thêm không gian lưu trữ. Nếu bạn thấy dung lượng database phình to mà không phải do dữ liệu gốc, hãy kiểm tra lại số lượng index
4. Tăng chi phí bảo trì và thời gian bảo trì index
Việc rebuild, reorganize, update statistics cho quá nhiều index làm tăng thời gian bảo trì, ảnh hưởng đến downtime và tài nguyên hệ thống
5. Có nhiều index không được sử dụng hoặc ít được sử dụng
Sử dụng các truy vấn thống kê (như sys.dm_db_index_usage_stats trên SQL Server hoặc pg_stat_user_indexes trên PostgreSQL) để phát hiện những index có số lần truy cập thấp hoặc bằng 0. Đây là dấu hiệu rõ ràng của index “rác”
6. Execution Plan phức tạp, Query Optimizer “bối rối”
Khi có quá nhiều index, bộ tối ưu truy vấn có thể chọn nhầm index, dẫn đến truy vấn không tận dụng được index tốt nhất hoặc execution plan trở nên phức tạp, khó kiểm soát
7. Tăng số lượng các thao tác Index Scan thay vì Index Seek
Nếu execution plan cho thấy nhiều truy vấn phải thực hiện Index Scan (quét toàn bộ index) thay vì Index Seek (tìm kiếm nhanh), có thể index không phù hợp hoặc quá nhiều index khiến optimizer không chọn đúng
1. Thống kê mức độ sử dụng index
SELECT
OBJECT_NAME(S.[OBJECT_ID]) AS [Table_Name],
I.[NAME] AS [Index_Name],
USER_SEEKS,
USER_SCANS,
USER_LOOKUPS,
USER_UPDATES
FROM
SYS.DM_DB_INDEX_USAGE_STATS AS S
INNER JOIN
SYS.INDEXES AS I
ON I.[OBJECT_ID] = S.[OBJECT_ID]
AND I.INDEX_ID = S.INDEX_ID
WHERE
OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1
ORDER BY
USER_SEEKS + USER_SCANS + USER_LOOKUPS ASC;
Index nào có USER_SEEKS, USER_SCANS, USER_LOOKUPS đều bằng 0 nhưng USER_UPDATES lớn là index không được sử dụng cho truy vấn, chỉ tốn tài nguyên ghi.

2. Liệt kê các index không được sử dụng
SELECT
OBJECT_NAME(IX.OBJECT_ID) AS Table_Name,
IX.name AS Index_Name,
SUM(PS.[used_page_count]) * 8 / 1024 AS IndexSizeMB,
IXUS.user_seeks AS NumOfSeeks,
IXUS.user_scans AS NumOfScans,
IXUS.user_lookups AS NumOfLookups,
IXUS.user_updates AS NumOfUpdates
FROM
sys.indexes IX
INNER JOIN
sys.dm_db_index_usage_stats IXUS ON IXUS.index_id = IX.index_id AND IXUS.OBJECT_ID = IX.OBJECT_ID
INNER JOIN
sys.dm_db_partition_stats PS on PS.object_id=IX.object_id
WHERE
OBJECTPROPERTY(IX.OBJECT_ID,'IsUserTable') = 1
AND IXUS.user_lookups = 0
AND IXUS.user_seeks = 0
AND IXUS.user_scans = 0
GROUP BY
OBJECT_NAME(IX.OBJECT_ID),
IX.name,
IXUS.user_seeks ,
IXUS.user_scans ,
IXUS.user_lookups ,
IXUS.user_updates
ORDER BY
IndexSizeMB DESC;
Có thể lọc thêm các index không phải là primary key hoặc unique để tránh xóa nhầm index quan trọng

Bài tập về nhà:
Index là công cụ mạnh mẽ nhưng không phải “cứ nhiều là tốt”. Đánh index tràn lan mà không partition chỉ khiến hệ thống thêm gánh nặng, hiệu năng tổng thể giảm sút. Hãy xây dựng chiến lược index dựa trên thực tế truy vấn, kết hợp partition hợp lý, audit định kỳ và loại bỏ index không cần thiết để hệ thống database luôn vận hành tối ưu, dễ mở rộng và bảo trì.
Bạn đã audit lại hệ thống index của mình gần đây chưa? Đừng để index trở thành “gánh nặng” thay vì “trợ thủ” cho hệ thống!
Chia sẻ thêm ý kiến hoặc kinh nghiệm tối ưu index của bạn ở phần bình luận nhé!
/Son Do - I share real-world lessons, team building & developer growth.
Tài liệu tham khảo
#Database #IndexStrategy #PostgreSQL #SQLServer #PerformanceTuning #DevOps #SystemDesign #SoftwareEngineering #dotnet #TechLeadership #wecommit100xshare #1percentbetter
Công nghệ - 19/08/2025 21:13:07
Tìm hiểu cách xây dựng hệ thống phát hiện ngôn ngữ ký hiệu theo thời gian thực bằng AI, sử dụng DETR để tăng cường khả năng tiếp cận và đổi mới. Kết nối lời nói và cử chỉ.
Công nghệ - 18/08/2025 13:38:25
Tối ưu hóa các hệ thống RAG bằng cách tận dụng siêu dữ liệu để truy xuất thông tin chính xác và nhanh chóng hơn, giải quyết các thách thức về dữ liệu dư thừa hoặc lỗi thời với công cụ LangExtract nguồn mở. Khám phá cách LangExtract sử dụng các mô hình ngôn ngữ tiên tiến để trích xuất và cấu trúc siêu dữ liệu, tạo ra một quy trình truy xuất hợp lý và hiệu quả.
Công nghệ - 01/08/2025 07:00:00
Gỡ lỗi LLM rất quan trọng vì quy trình làm việc của chúng phức tạp và liên quan đến nhiều phần như chuỗi, lời nhắc, API, công cụ, trình truy xuất, v.v.
Công nghệ - 19/06/2025 03:05:09
Code xong chạy được là chưa đủ – phải biết khi nào nó "chết" nữa chứ 😅
Bạn đang triển khai ứng dụng trên Kubernetes, Docker hay môi trường production nào? Và bạn từng "toát mồ hôi" vì service chết mà không ai báo?
Công nghệ - 16/07/2025 13:41:17
Công nghệ - 27/06/2025 03:15:44
Công nghệ - 11/12/2025 15:05:29
[Góc chuyện nghề] bán account game để đi học nghệ - bạn dám không?
Làm nghề 20 năm, gặp nhiều sinh viên, nhưng chiều qua tôi khá bất ngờ với một cậu em tên Quang. Em Quang muốn theo nghề BA và mong muốn lương 20 triệu sau khi làm việc 1.5 năm tới 2 năm trong nghề.
Công nghệ - 22/09/2025 08:59:20
Dừng ngay việc dùng DateTime.Now trong APIs, đó là ổ lỗi tiềm ẩn trong hệ thống của bạn
⏱️ Tôi từng nghĩ DateTime.Now là một thứ vô hại, đơn giản và tiện lợi, cho đến khi gặp những vấn đề về múi giờ. Những lỗi "tưởng chừng nhỏ" này lại chính là nguồn cơn của sự thất vọng và tốn kém thời gian cho nhiều đội ngũ phát triển.
Công nghệ - 14/03/2025 04:30:32