@Pierre 303 đã nói rồi, nhưng tôi sẽ nói lại. NÊN sử dụng các chỉ mục trên các tổ hợp cột. Một chỉ mục kết hợp trên (a, b)
chỉ chậm hơn một chút cho các truy vấn trên a
một chỉ mục trên a
một mình và tốt hơn nhiều nếu truy vấn của bạn kết hợp cả hai cột. Một số cơ sở dữ liệu có thể tham gia các chỉ mục trên a
và b
trước khi nhấn bảng, nhưng điều này gần như không tốt bằng việc có một chỉ mục kết hợp. Khi bạn tạo một chỉ mục kết hợp, bạn nên đặt cột có khả năng được tìm kiếm đầu tiên trong chỉ mục kết hợp.
Nếu cơ sở dữ liệu của bạn hỗ trợ nó, DO đưa chỉ số về chức năng mà xuất hiện trong các truy vấn chứ không phải cột. (Nếu bạn đang gọi một hàm trên một cột, các chỉ mục trên cột đó là vô ích.)
Nếu bạn đang sử dụng một cơ sở dữ liệu với các bảng tạm thời đúng là bạn có thể tạo và tiêu diệt một cách nhanh chóng (ví dụ như PostgreSQL, MySQL, nhưng không Oracle), sau đó DO tạo chỉ số trên bảng tạm thời.
Nếu bạn đang sử dụng một cơ sở dữ liệu cho phép nó (ví dụ Oracle), DO khóa trong kế hoạch truy vấn tốt. Tối ưu hóa truy vấn theo thời gian sẽ thay đổi kế hoạch truy vấn. Họ thường cải thiện kế hoạch. Nhưng đôi khi họ làm cho nó tồi tệ hơn đáng kể. Nói chung, bạn sẽ không thực sự nhận thấy các cải tiến kế hoạch - truy vấn không phải là nút cổ chai. Nhưng một kế hoạch xấu duy nhất có thể phá hủy một trang web bận rộn.
KHÔNG có chỉ mục trên các bảng bạn sắp thực hiện tải dữ liệu lớn. Việc thả chỉ mục, tải dữ liệu, sau đó xây dựng lại chỉ mục sẽ nhanh hơn nhiều so với việc duy trì chúng khi bạn tải bảng.
KHÔNG sử dụng các chỉ mục trên các truy vấn phải truy cập nhiều hơn một phần nhỏ của một bảng lớn. . Sẽ không hữu ích khi lập chỉ mục về giới vì bạn vẫn phải truy cập 50% số hàng. Bạn thực sự muốn sử dụng quét toàn bộ bảng thay thế. Lý do là các chỉ mục kết thúc việc truy cập một tệp lớn một cách ngẫu nhiên, khiến bạn cần tìm kiếm đĩa. Tìm kiếm đĩa là chậm. Như một trường hợp, gần đây tôi đã quản lý để tăng tốc truy vấn dài một giờ giống như:
SELECT small_table.id, SUM(big_table.some_value)
FROM small_table
JOIN big_table
ON big_table.small_table_id = small_table.id
GROUP BY small_table.id
dưới 3 phút bằng cách viết lại như sau:
SELECT small_table.id, big_table_summary.summed_value
FROM small_table
JOIN (
SELECT small_table_id, SUM(some_value) as summed_value
FROM big_table
GROUP BY small_table_id
) big_table_summary
ON big_table_summary.small_table_id = small_table.id
đã buộc cơ sở dữ liệu phải hiểu rằng nó không nên cố gắng sử dụng chỉ mục hấp dẫn trên big_table.small_table_id
. (Một cơ sở dữ liệu tốt, chẳng hạn như Oracle, nên tự mình tìm ra. Truy vấn này đang chạy trên MySQL.)
Cập nhật: Dưới đây là một lời giải thích về điểm tìm kiếm đĩa mà tôi đã thực hiện. Một chỉ mục cung cấp một tra cứu nhanh để cho biết vị trí của dữ liệu trong bảng. Đây thường là một chiến thắng vì bạn sẽ chỉ nhìn vào dữ liệu bạn cần xem. Nhưng không phải lúc nào cũng vậy, đặc biệt nếu cuối cùng bạn sẽ xem xét rất nhiều dữ liệu. Đĩa truyền dữ liệu tốt, nhưng làm cho tra cứu chậm. Việc tra cứu ngẫu nhiên dữ liệu trên đĩa mất 1/200 giây. Phiên bản chậm của truy vấn đã làm một cái gì đó giống như 600.000 trong số đó và mất gần một giờ. (Nó đã tìm kiếm nhiều hơn thế, nhưng bộ nhớ đệm đã bắt được một số trong số đó.) Ngược lại, phiên bản nhanh biết rằng nó phải đọc mọi thứ và truyền dữ liệu với tốc độ 70 MB / giây. Nó đã vượt qua một bảng 11 GB trong vòng dưới 3 phút.