2009-04-18 38 views
15

Gần đây tôi đã tăng tốc một truy vấn phức tạp theo thứ tự độ lớn bằng cách cho SQLite một chỉ mục tốt để làm việc. Kết quả như thế này làm cho tôi tự hỏi liệu tôi có nên lập chỉ mục nhiều trường khác thường được sử dụng cho các mệnh đề JOIN hoặc ORDER BY hay không. Nhưng tôi không muốn quá hăng hái và khiến tôi phản tác dụng: Tôi cho rằng phải có một số lý do: không phải là để tạo chỉ mục hoặc mọi trường sẽ được lập chỉ mục theo mặc định.Nhược điểm của việc có nhiều chỉ số là gì?

Tôi đang sử dụng SQLite trong trường hợp này, nhưng tất nhiên lời khuyên về tư tưởng bất khả tri DBMS cũng được chào đón.

Trả lời

36

Chỉ mục làm chậm chèn và cập nhật (có thể trở thành vấn đề thực sự nghiêm trọng với khóa) và không gian đĩa chi phí. Nó khá là nhiều.

+2

Điều đó bao gồm nó. Đừng quên rằng bạn * cần * cũng cần các chỉ mục thích hợp để có hiệu suất chèn/cập nhật/xóa tốt. Giống như tất cả mọi thứ, đó là một sự cân bằng. –

+5

chèn không được hưởng lợi từ chỉ mục ... Cập nhật và Xóa yêu cầu tìm các hàng liên quan, vì vậy chúng được hưởng lợi từ các chỉ mục cho bước đó, nhưng sau đó nếu bạn có nhiều chỉ mục, ngay cả lợi ích đó cũng có thể bị từ chối. Như bạn nói, đó là tất cả sự cân bằng :) – MatBailie

6

Chỉ mục sử dụng hết dung lượng đĩa để lưu trữ và mất thời gian để tạo và duy trì. Những người không sử dụng không mang lại bất kỳ lợi ích nào. Nếu có nhiều chỉ mục ứng viên cho truy vấn, truy vấn có thể bị chậm lại bằng cách chọn máy chủ "sai" cho truy vấn.

Sử dụng các yếu tố đó để quyết định xem bạn có cần chỉ mục hay không. Thường có thể tạo các chỉ mục sẽ KHÔNG BAO GIỜ được sử dụng - ví dụ, và chỉ mục trên một trường (không null) chỉ với hai giá trị có thể, gần như chắc chắn sẽ vô dụng.

Bạn cần giải thích các truy vấn của ứng dụng của riêng mình để đảm bảo rằng các truy vấn được thực hiện thường xuyên sử dụng các chỉ mục hợp lý nếu có thể và không tạo thêm chỉ mục nào hơn yêu cầu.

+0

Lập chỉ mục trường có hai giá trị có thể (đôi khi) hữu ích khi phân phối vô cùng không đồng đều - và cơ sở dữ liệu biết điều đó thông qua thống kê. –

5

Chi phí của chỉ mục trong không gian đĩa thường không đáng kể. Chi phí viết bổ sung để cập nhật chỉ mục khi thay đổi bảng thường là vừa phải. Chi phí khóa bổ sung có thể nghiêm trọng.

Tùy thuộc vào tỷ lệ đọc và ghi trên bảng và tần suất chỉ mục thực sự được sử dụng để tăng tốc truy vấn.

+1

Hmmm, tùy thuộc vào bảng và các trường được lập chỉ mục, chi phí không gian đĩa không phải lúc nào cũng tầm thường. Tôi đã có nhiều trường hợp trong đó tổng của không gian chỉ mục là gấp đôi (hoặc nhiều hơn) so với tổng của không gian bảng ... – MatBailie

+0

Đồng ý với Dems; cho một bảng hẹp, một chỉ số nonclustered có thể có kích thước tương đương với bảng. Nói một chỉ số tốn một nửa không gian đĩa của bảng; một bảng có sáu chỉ số lớn hơn bốn lần trên đĩa như một chỉ mục chưa được lập chỉ mục. Các chỉ mục được nhóm lại về cơ bản là miễn phí. –

+1

Không, chi phí của chỉ mục trong không gian đĩa không phải là "thường tầm thường".Có thể sử dụng nhiều không gian với các chỉ mục. – MarkR

6

Để kiểm tra ứng dụng cụ thể của bạn, bạn có thể đặt "GIẢI THÍCH KẾ HOẠCH QUERY" trước bất kỳ truy vấn nào bạn chạy và kiểm tra kết quả. Nó sẽ cho bạn thấy nó đang ở đâu hoặc không sử dụng các chỉ mục.

Bằng cách đó bạn có thể xác định nơi bạn có thể sử dụng nhiều chỉ mục hơn và nơi chúng sẽ không tạo sự khác biệt.

Sqlite Explain

tôi sử dụng SqliteSpy để tay truy vấn thử nghiệm mà dường như được gây rắc rối.

Các vấn đề liên quan