8.3.1 & nbsp; cách MySQL sử dụng chỉ mục
Các chỉ mục được sử dụng để tìm các hàng có giá trị cột cụ thể một cách nhanh chóng. Không có chỉ mục, MySQL phải bắt đầu với hàng đầu tiên và sau đó đọc qua toàn bộ bảng để tìm các hàng có liên quan. Bảng càng lớn, chi phí này càng nhiều. Nếu bảng có một chỉ mục cho các cột được đề cập, MySQL có thể nhanh chóng xác định vị trí để tìm kiếm ở giữa tệp dữ liệu mà không phải xem tất cả dữ liệu. Điều này nhanh hơn nhiều so với đọc mỗi hàng tuần tự.
Hầu hết các chỉ số MySQL [PRIMARY KEY
, UNIQUE
, INDEX
và FULLTEXT
] được lưu trữ trong các cây B. Ngoại lệ: Các chỉ mục trên các loại dữ liệu không gian sử dụng cây R; MEMORY
Bảng cũng hỗ trợ các chỉ mục băm; InnoDB
Sử dụng danh sách đảo ngược cho các chỉ mục FULLTEXT
.
Nói chung, các chỉ mục được sử dụng như mô tả trong các cuộc thảo luận sau đây. Các đặc điểm cụ thể đối với các chỉ mục băm [như được sử dụng trong bảng MEMORY
] được mô tả trong Phần & NBSP; 8.3.9, So sánh của B-Tree và Hash Indexes.
MySQL sử dụng các chỉ mục cho các hoạt động này:
Để tìm các hàng phù hợp với một mệnh đề
0 một cách nhanh chóng.SELECT key_part3 FROM tbl_name WHERE key_part1=1
Để loại bỏ các hàng từ việc xem xét. Nếu có sự lựa chọn giữa nhiều chỉ mục, MySQL thường sử dụng chỉ mục tìm số lượng hàng nhỏ nhất [chỉ mục chọn lọc nhất].
Nếu bảng có chỉ số nhiều cột, bất kỳ tiền tố ngoài cùng bên trái của chỉ mục đều có thể được sử dụng bởi trình tối ưu hóa để tra cứu các hàng. Ví dụ: nếu bạn có chỉ mục ba cột trên
1, bạn đã lập chỉ mục các khả năng tìm kiếm trênSELECT key_part3 FROM tbl_name WHERE key_part1=1
2,SELECT key_part3 FROM tbl_name WHERE key_part1=1
3 vàSELECT key_part3 FROM tbl_name WHERE key_part1=1
4. Để biết thêm thông tin, xem Phần & NBSP; 8.3.6, Chỉ số nhiều cột của Hồi giáo.SELECT key_part3 FROM tbl_name WHERE key_part1=1
Để truy xuất các hàng từ các bảng khác khi thực hiện tham gia. MySQL có thể sử dụng các chỉ mục trên các cột hiệu quả hơn nếu chúng được khai báo là cùng loại và kích thước. Trong bối cảnh này,
5 vàSELECT key_part3 FROM tbl_name WHERE key_part1=1
6 được coi là giống nhau nếu chúng được tuyên bố là cùng kích thước. Ví dụ,SELECT key_part3 FROM tbl_name WHERE key_part1=1
7 vàSELECT key_part3 FROM tbl_name WHERE key_part1=1
8 có cùng kích thước, nhưngSELECT key_part3 FROM tbl_name WHERE key_part1=1
7 vàSELECT key_part3 FROM tbl_name WHERE key_part1=1
PRIMARY KEY
0 thì không.Để so sánh giữa các cột Chuỗi không phân biệt, cả hai cột nên sử dụng cùng một bộ ký tự. Ví dụ, so sánh cột
PRIMARY KEY
1 với cộtPRIMARY KEY
2 ngăn chặn việc sử dụng chỉ mục.So sánh các cột không giống nhau [ví dụ so sánh cột chuỗi với cột tạm thời hoặc số] có thể ngăn chặn việc sử dụng các chỉ mục nếu các giá trị không thể được so sánh trực tiếp mà không chuyển đổi. Đối với một giá trị đã cho, chẳng hạn như
PRIMARY KEY
3 trong cột số, nó có thể so sánh bằng bất kỳ số lượng giá trị nào trong cột chuỗi nhưPRIMARY KEY
4,PRIMARY KEY
5,PRIMARY KEY
6 hoặcPRIMARY KEY
7. Quy tắc này sử dụng bất kỳ chỉ mục nào cho cột chuỗi.Để tìm giá trị
PRIMARY KEY
8 hoặcPRIMARY KEY
9 cho một cột được lập chỉ mục cụ thểUNIQUE
0. Điều này được tối ưu hóa bởi bộ tiền xử lý kiểm tra xem bạn đang sử dụngUNIQUE
1 =UNIQUE
2 trên tất cả các phần chính xảy ra trướcUNIQUE
0 trong chỉ mục. Trong trường hợp này, MySQL thực hiện một tra cứu khóa duy nhất cho mỗi biểu thứcPRIMARY KEY
8 hoặcPRIMARY KEY
9 và thay thế nó bằng một hằng số. Nếu tất cả các biểu thức được thay thế bằng các hằng số, truy vấn sẽ quay lại cùng một lúc. Ví dụ:SELECT MIN[key_part2],MAX[key_part2] FROM tbl_name WHERE key_part1=10;
Để sắp xếp hoặc nhóm một bảng nếu việc sắp xếp hoặc nhóm được thực hiện trên một tiền tố ngoài cùng bên trái của chỉ mục có thể sử dụng [ví dụ:
UNIQUE
6,UNIQUE
7]. Nếu tất cả các phần chính được theo sau bởiUNIQUE
8, khóa được đọc theo thứ tự ngược lại. . 13, chỉ số giảm dần của người Viking.Trong một số trường hợp, một truy vấn có thể được tối ưu hóa để truy xuất các giá trị mà không cần tham khảo các hàng dữ liệu. .
SELECT key_part3 FROM tbl_name WHERE key_part1=1
Các chỉ mục ít quan trọng hơn đối với các truy vấn trên các bảng nhỏ hoặc các bảng lớn trong đó các truy vấn báo cáo xử lý hầu hết hoặc tất cả các hàng. Khi một truy vấn cần truy cập hầu hết các hàng, việc đọc tuần tự nhanh hơn so với làm việc thông qua một chỉ mục. Đọc tuần tự tối thiểu hóa đĩa tìm kiếm, ngay cả khi không phải tất cả các hàng là cần thiết cho truy vấn. Xem Phần & NBSP; 8.2.1.23, Tránh các lần quét bảng đầy đủ để biết chi tiết.