Table of Contents
Khi làm việc với database, một trong những yếu tố quan trọng nhất để cải thiện hiệu suất của query là sử dụng index. Index đóng vai trò quan trọng trong việc tăng tốc độ truy xuất dữ liệu, tương tự như một bảng mục lục ở cuối cuốn sách giúp bạn tìm kiếm thông tin cụ thể mà không phải lật qua từng trang. Nếu không có index, database sẽ cần quét toàn bộ bảng cho mỗi query, điều này không chỉ tốn thời gian mà còn kém hiệu quả, đặc biệt khi dữ liệu ngày càng lớn.
Table of Contents
Database Index là gì?
Trong database, index là một cấu trúc dữ liệu cho phép tìm kiếm nhanh các bản ghi trong bảng. Bằng cách giảm thiểu lượng dữ liệu cần phải quét, index có thể cải thiện đáng kể tốc độ query. Index có thể cải thiện tốc độ của select, nhưng cần lưu ý rằng việc duy trì index sẽ tốn ổ cứng và có thể làm chậm các thao tác insert và update.
Hash Index
Hash index sử dụng hash function để map dữ liệu vào một vị trí cố định trong array. Khi bạn tìm kiếm một giá trị, hash function được áp dụng cho việc tìm kiếm, nhanh chóng tìm đến nơi dữ liệu được lưu trữ.
Hash index hoạt động bằng cách chuyển đổi khóa index thành một giá trị nằm trong một phạm vi cố định. Kết quả này sau đó được sử dụng để xác định vị trí lưu trữ dữ liệu, giúp tránh việc quét toàn bộ bảng. Hash index đặc biệt nhanh đối với các so sánh bằng (chẳng hạn như query = hoặc IN), vì hash function cung cấp kết quả chính xác. Tuy nhiên, chúng không hỗ trợ range query (như <, >, hoặc BETWEEN) vì các giá trị hash không được sắp xếp theo thứ tự
Hash index lý tưởng cho các trường hợp có khối lượng tìm kiếm chính xác một giá trị, chẳng hạn như tìm kiếm một ID người dùng hoặc địa chỉ email cụ thể. Chúng hoạt động tốt khi không cần thực hiện range query, vì hash index không phù hợp để truy xuất dữ liệu giữa một khoảng giá trị..
Mặc dù có nhiều ưu điểm, hash index có một số hạn chế. Chúng không hỗ trợ range query, nghĩa là nếu bạn cần thực hiện các tìm kiếm như “tìm tất cả các đơn hàng trong khoảng từ 100 đến 200 đô la” hash index sẽ không có tác dụng. Thêm vào đó, do các hash function đưa các giá trị vào nơi khác nhau trong ổ cứng, điều này khiến cho database phải xử lý thêm khi muốn dữ liệu được sắp xếp theo thứ tự.
B-Tree Index
B-tree (Balanced Tree) index là phương pháp tạo index được sử dụng rộng rãi nhất trong database. Không giống như hash index, B-tree index lưu trữ dữ liệu theo cấu trúc cây phân cấp (hierarchical tree), trong đó mỗi nút đại diện cho một phạm vi giá trị. Cấu trúc này giúp B-tree index phù hợp với nhiều loại query khác nhau, bao gồm cả exact lookups query và range query.
Trong B-tree, dữ liệu được lưu trữ theo thứ tự, cho phép database nhanh chóng duyệt qua tree để tìm khóa cụ thể. Cấu trúc này đảm bảo rằng B-tree index có thể xử lý range query vì chúng có thể truy xuất dữ liệu hiệu quả trong một phạm vi giá trị cụ thể. Đặc tính tự cân bằng của B-tree đảm bảo rằng các thao tác như select, insert và update đều diễn ra hiệu quả, ngay cả khi dữ liệu tăng lên.
B-tree index rất linh hoạt và có thể xử lý các query đa mục đích, bao gồm cả exact lookups query và range query. Chúng đặc biệt hữu ích khi bạn cần sắp xếp dữ liệu theo một trường cụ thể, chẳng hạn như truy xuất các bản ghi theo thứ tự tăng dần hoặc giảm dần. Chúng cũng hoạt động tốt trong các môi trường OLTP (Online Transaction Processing), nơi các bảng thường xuyên được cập nhật, vì B-tree xử lý việc chèn và cập nhật hiệu quả trong khi vẫn duy trì thứ tự dữ liệu.
Ưu điểm chính của B-tree index là khả năng xử lý range query và dữ liệu được sắp xếp một cách hiệu quả. Tuy nhiên, chúng thường chậm hơn so với hash index khi thực hiện exact lookups query.
Lựa chọn giữa Hash Index và B-Tree Index
Việc chọn giữa hash index và B-tree index phụ thuộc vào tính chất của query và khối lượng công việc của database.
Nếu query của bạn chủ yếu dùng exact lookups query và không yêu cầu range query, hash index sẽ phù hợp hơn. Tuy nhiên, nếu query của bạn liên quan đến range query hoặc cần trả về dữ liệu theo thứ tự, thì B-tree index là lựa chọn tốt hơn.
Kết luận
Việc hiểu khi nào nên sử dụng hash index hoặc B-tree index có thể tạo ra sự khác biệt lớn về hiệu suất của database. Bằng cách thay đổi index cho phù hợp với query, bạn có thể đảm bảo việc truy xuất dữ liệu nhanh hơn và sử dụng tài nguyên một cách hiệu quả.
Nếu muốn tìm hiểu sâu hơn về database index, các bạn có thể tìm đọc Relational Database Index Design and the Optimizers của Tapio Lahdenmaki và Mike Leach. Cuốn sách này sẽ cung cấp cho bạn tất cả những gì cần biết về cách hoạt động của index và giúp các bạn design index hiệu quả hơn.