Bạn phải tra cứu mọi điều kiện ở đâu và mọi tham gia ... có điều kiện. Cả hai hoạt động giống nhau.
Giả sử chúng ta viết
select name
from customer
where customerid=37;
Bằng cách nào đó, DBMS phải tìm bản ghi hoặc các bản ghi có customerid =37. Nếu không có chỉ mục, cách duy nhất để làm điều này là đọc mọi bản ghi trong bảng so sánh customerid với 37. Ngay cả khi nó tìm thấy một chỉ mục, nó không có cách nào để biết chỉ có một, vì vậy nó phải tiếp tục tìm kiếm những người khác.
Nếu bạn tạo một chỉ mục trên customerid, DBMS có các cách để tìm kiếm chỉ mục rất nhanh. Nó không phải là một tìm kiếm tuần tự, mà tùy thuộc vào cơ sở dữ liệu, một tìm kiếm nhị phân hoặc một số phương pháp hiệu quả khác. Chính xác như thế nào không quan trọng, hãy chấp nhận rằng nó nhanh hơn nhiều so với tuần tự. Chỉ mục sau đó đưa nó trực tiếp đến bản ghi hoặc các bản ghi thích hợp. Hơn nữa, nếu bạn chỉ định rằng chỉ mục là "duy nhất", thì cơ sở dữ liệu sẽ biết rằng chỉ có thể có một nên không lãng phí thời gian tìm kiếm một giây. (Và DBMS sẽ ngăn bạn thêm giây.)
Bây giờ hãy xem xét truy vấn này:
select name
from customer
where city='Albany' and state='NY';
Bây giờ chúng ta có hai điều kiện. Nếu bạn chỉ có một chỉ mục trên một trong các trường đó, DBMS sẽ sử dụng chỉ mục đó để tìm một tập hợp con của các bản ghi, sau đó tìm kiếm tuần tự các bản ghi đó. Ví dụ:nếu bạn có một chỉ mục trên tiểu bang, DBMS sẽ nhanh chóng tìm thấy bản ghi đầu tiên cho NY, sau đó tìm kiếm tuần tự tìm kiếm city ='Albany' và ngừng tìm kiếm khi nó đạt đến bản ghi cuối cùng cho NY.
Nếu bạn có một chỉ mục bao gồm cả hai trường, tức là "tạo chỉ mục trên khách hàng (tiểu bang, thành phố)", thì DBMS có thể thu phóng ngay lập tức đến các bản ghi phù hợp.
Nếu bạn có hai chỉ mục riêng biệt, một chỉ mục trên mỗi trường, DBMS sẽ có các quy tắc khác nhau mà nó áp dụng để quyết định sử dụng chỉ mục nào. Một lần nữa, chính xác cách thực hiện điều này phụ thuộc vào DBMS cụ thể mà bạn đang sử dụng, nhưng về cơ bản nó cố gắng giữ thống kê về tổng số bản ghi, số lượng các giá trị khác nhau và sự phân bố của các giá trị. Sau đó, nó sẽ tìm kiếm các bản ghi đó một cách tuần tự để tìm những bản ghi thỏa mãn điều kiện khác. Trong trường hợp này, DBMS có thể quan sát thấy rằng có nhiều thành phố hơn số tiểu bang, vì vậy bằng cách sử dụng chỉ mục thành phố, nó có thể nhanh chóng thu phóng đến các bản ghi 'Albany'. Sau đó, nó sẽ tuần tự tìm kiếm những thứ này, kiểm tra trạng thái của từng thứ so với 'NY'. Nếu bạn có hồ sơ cho Albany, California, những hồ sơ này sẽ bị bỏ qua.
Mọi tham gia đều yêu cầu một số loại tra cứu.
Giả sử chúng tôi viết
select customer.name
from transaction
join customer on transaction.customerid=customer.customerid
where transaction.transactiondate='2010-07-04' and customer.type='Q';
Bây giờ DBMS phải quyết định bảng nào sẽ đọc trước, chọn các bản ghi thích hợp từ đó, rồi tìm các bản ghi phù hợp trong bảng khác.
Nếu bạn đã có chỉ mục trên transaction.transactiondate và customer.customerid, kế hoạch tốt nhất có thể là tìm tất cả các giao dịch có ngày này, sau đó đối với mỗi người trong số đó, hãy tìm khách hàng có customerid phù hợp và sau đó xác minh rằng khách hàng có đúng loại.
Nếu bạn không có chỉ mục trên customer.customerid, thì DBMS có thể nhanh chóng tìm thấy giao dịch, nhưng sau đó đối với mỗi giao dịch, nó sẽ phải tìm kiếm tuần tự trong bảng khách hàng để tìm một customerid phù hợp. (Điều này có thể sẽ rất chậm.)
Thay vào đó, giả sử rằng các chỉ mục duy nhất bạn có là trên transaction.customerid và customer.type. Sau đó, DBMS có thể sẽ sử dụng một kế hoạch hoàn toàn khác. Nó có thể sẽ quét bảng khách hàng để tìm tất cả các khách hàng có đúng loại, sau đó tìm tất cả các giao dịch cho khách hàng này và tuần tự tìm kiếm chúng cho đúng ngày.
Chìa khóa quan trọng nhất để tối ưu hóa là tìm ra những chỉ mục nào thực sự sẽ giúp ích và tạo ra những chỉ mục đó. Các chỉ mục bổ sung, không được sử dụng là một gánh nặng đối với cơ sở dữ liệu vì phải làm việc để duy trì chúng và nếu chúng không bao giờ được sử dụng thì điều này sẽ lãng phí công sức.
Bạn có thể cho biết DBMS sẽ sử dụng chỉ mục nào cho bất kỳ truy vấn nhất định nào bằng lệnh EXPLAIN. Tôi sử dụng điều này mọi lúc để xác định xem các truy vấn của tôi có đang được tối ưu hóa tốt hay không hoặc liệu tôi có nên tạo các chỉ mục bổ sung hay không. (Đọc tài liệu về lệnh này để biết giải thích về đầu ra của nó.)
Lưu ý:Hãy nhớ rằng tôi đã nói rằng DBMS lưu giữ thống kê về số lượng bản ghi và số lượng các giá trị khác nhau, v.v. trong mỗi bảng. EXPLAIN có thể cung cấp cho bạn một kế hoạch hoàn toàn khác ngày hôm nay so với ngày hôm qua nếu dữ liệu đã thay đổi. Ví dụ:nếu bạn có một truy vấn kết hợp hai bảng và một trong những bảng này rất nhỏ trong khi bảng kia lớn, nó sẽ có xu hướng đọc bảng nhỏ trước và sau đó tìm các bản ghi phù hợp trong bảng lớn. Việc thêm bản ghi vào bảng có thể thay đổi bản ghi lớn hơn, và do đó dẫn đến việc DBMS thay đổi kế hoạch của nó. Vì vậy, bạn nên cố gắng GIẢI THÍCH đối với cơ sở dữ liệu với dữ liệu thực tế. Chạy với cơ sở dữ liệu thử nghiệm với 5 bản ghi trong mỗi bảng có giá trị thấp hơn nhiều so với chạy với cơ sở dữ liệu trực tiếp.
Chà, còn nhiều điều có thể nói, nhưng tôi không muốn viết sách ở đây.