7.1 Lý do xuất hiện chỉ số

Một điều quan trọng khác mà không có cơ sở dữ liệu thì không thể có được là các chỉ mục.

Hãy tưởng tượng tình huống có 10 triệu người dùng trong bảng người dùng và bạn muốn hiển thị tất cả những người có cấp độ trên 90. Truy vấn này rất đơn giản để viết:

SELECT * FROM user WHERE level > 90

Tuyệt vời, chúng tôi đã viết yêu cầu trong vòng chưa đầy một phút. Và sẽ mất bao lâu để thực hiện truy vấn này từ máy chủ SQL? Để thực hiện một truy vấn như vậy, anh ta sẽ phải trải qua 10 triệu bản ghi và ngay cả khi chỉ có một bản ghi, sẽ mất rất nhiều thời gian.

Làm thế nào chúng ta có thể thực hiện một nhiệm vụ tương tự trong Java? Trước tiên, chúng tôi sẽ sắp xếp tập hợp người dùng theo cấp độ và sau đó chúng tôi có thể nhanh chóng tìm thấy các bản ghi cần thiết bằng cách sử dụng tìm kiếm nhị phân. Tôi hy vọng tôi không cần phải giải thích nó là gì?

Tuyệt vời, nhưng nếu bây giờ chúng tôi cần chọn những người dùng có ngày đăng ký trước năm 2020 thì sao? Sắp xếp lại theo ngày đăng ký và sử dụng tìm kiếm nhị phân.

Đúng vậy, nếu chúng ta thực hiện lọc trên một số trường, không chỉ một lần mà thường xuyên, thì việc lưu trữ dữ liệu được sắp xếp theo trường này sẽ rất hữu ích.

Và làm cách nào để lưu trữ dữ liệu được sắp xếp đồng thời theo các trường khác nhau?

Và câu trả lời rất đơn giản - bạn không cần lưu trữ dữ liệu mà chỉ lưu trữ các chỉ mục của chúng trong một số bảng toàn cầu.

Giả sử có 10 người dùng có id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Và bạn quyết định sắp xếp chúng theo cấp độ, thì mảng id của chúng sẽ chẳng hạn như thế này: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Và nếu chúng ta sắp xếp chúng theo ngày, thì chúng ta sẽ nhận được, chẳng hạn: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Mảng của những id này được gọi là chỉ mục . Bản thân các yếu tố là lớn, chúng tôi không chạm vào chúng. Trong Java, chúng tôi không chạm vào các đối tượng mà lưu trữ các tham chiếu của chúng; trong SQL, chúng tôi không chạm vào các chuỗi thực mà lưu trữ các số của chúng.

Hãy để tôi viết lại điều này bằng mã Java:

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

Sắp xếp các bộ sưu tập không có nghĩa là di chuyển các phần tử thực tế. Bộ sưu tập không lưu trữ các đối tượng thực, nhưng liên kết với chúng. Điều này cũng đúng với các bảng SQL. Dòng thực tự dối lòng và dối mình.

Và khi chúng ta cần thường xuyên thực hiện các lựa chọn cho một số trường, thì chúng ta thêm một chỉ mục khác vào bảng (tương tự như một bộ sưu tập mới trong Java) và sắp xếp các hàng của bảng, lưu trữ thứ tự đã sắp xếp của chúng trong một tệp chỉ mục đặc biệt.

Tôi hy vọng việc so sánh Java đã giúp một chút. Một chút luyện tập - và đối với bạn, việc sử dụng các chỉ mục cũng sẽ trở thành giải pháp rõ ràng nhất.

7.2 Thêm chỉ mục vào bảng

Chỉ mục có thể được chỉ định ngay lập tức trong quá trình tạo bảng hoặc được thêm vào sau. Thông thường, đó là trường hợp thứ hai xảy ra - các chỉ mục được thêm vào khi kích thước bảng tăng lên và việc lấy mẫu dữ liệu chậm lại.

Việc thêm chỉ mục vào bảng rất đơn giản:

ALTER TABLE table
    ADD INDEX index_name (column);

Nếu bạn thường tra cứu các bản ghi trong nhiều cột cùng một lúc, bạn có thể chỉ định một chỉ mục tổng hợp: SQL sử dụng nhiều cột để tổng hợp nó.

Việc thêm chỉ mục tổng hợp vào bảng cũng rất đơn giản:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Chỉ mục chiếm nhiều dung lượng đĩa, vì vậy nếu bạn không cần chỉ mục nữa, bạn luôn có thể xóa nó:

ALTER TABLE table
    DROP INDEX index_name;

Bản thân các chỉ mục là một phần khá ẩn của cơ sở dữ liệu. Chúng không ảnh hưởng đến định dạng viết truy vấn theo bất kỳ cách nào. Chỉ là sự hiện diện của chúng tăng tốc độ lấy mẫu dữ liệu và làm chậm quá trình bổ sung và sao lưu của chúng.

Nhưng xem xét tầm quan trọng của tốc độ trong thế giới ngày nay và dung lượng đĩa rẻ như thế nào, vui lòng thêm chỉ mục cho mọi trường hợp. Xin lỗi admin...