2012-03-21 32 views
5

Trong bảng của tôi, tôi có hai cột liên quan chặt chẽ A và B. gì cân nhắc khả năng tôi sẽ thực hiện để quyết định có nên tạo:Tôi có nên xác định chỉ mục (A) và chỉ mục (B) hoặc chỉ mục (A, B) hoặc cả hai?

  • chỉ mục (A) và chỉ số (B),
  • chỉ mục (A, B),
  • cả hai điều trên?

Làm thế nào để thay đổi này nếu tôi:

  1. chỉ sử dụng các truy vấn như where A = 5 and B = 10 (và không bao giờ như where A = 5),
  2. cũng sử dụng các truy vấn như where A > 3 and A < 10 and B > 12 and B < 20,
  3. thường sử dụng order by (A, B),
  4. thường sử dụng group by (A, B)?

Lưu ý: Tôi cố ý không cung cấp thêm chi tiết về trường hợp cụ thể của tôi vì tôi muốn có câu trả lời chung cũng sẽ phục vụ cho người khác. Tôi sử dụng mysql, nhưng nếu bạn đưa ra câu trả lời chung chung hơn bao gồm SQL nói chung sẽ là tuyệt vời.

+0

lưu ý rằng tôi đã đọc [câu hỏi này] (http://stackoverflow.com/questions/2291193/mysql-difference-between-add-indexa-add-indexb-and-add-ind) nhưng nó không ' t bao gồm tất cả các câu hỏi của tôi. – TMS

+0

Sử dụng GIẢI THÍCH nhiều nhất có thể trên truy vấn của bạn và thử nghiệm với các cấu hình chỉ mục khác nhau. Điều đó nên khá là có tính hướng dẫn! – SirDarius

Trả lời

4

Ok, khi bạn có chỉ mục (A, B), MySQL cũng có thể sử dụng nó làm chỉ mục (A). Tuyên bố AB và A không có ý nghĩa. Tuyên bố AB và B thì, tuy nhiên

Vì vậy, bạn có những lựa chọn này:

  1. Index (A, B)
  2. Index (A, B) và Index (B)
  3. Index (A) và Index (B)
+1

Tốt, cảm ơn! Nhưng bạn có nghĩa là 3 lựa chọn, cũng 'Chỉ số (A, B)' một mình? – TMS

+4

Nếu bạn không bao giờ tìm kiếm trên cột 'B' mà không có cột' A', bạn cũng có thể sử dụng 'Chỉ mục (A, B) '. Điều cần nhớ là ** 'Index (A, B)' không thể được sử dụng để tìm kiếm trên B một mình **. Đó là hợp lý: suy nghĩ về một từ điển về họ, tên: tìm tất cả những người có tên 'thomas' trong đó sẽ rất khó khăn. – Konerak

+0

cảm ơn Konerak. Nhưng những gì về các truy vấn 2: 'nơi A> 3 và A < 10 and B > 12 và B <20'? Nó không phải là một trường hợp chỉ số riêng biệt cho B là cần thiết? – TMS

3

Nếu bạn luôn sử dụng cả hai cột (hoặc một trong những đầu tiên của chỉ số) trong bạn WHERE/GROUP BY/ORDER BY bạn nên sử dụng index(A,B).

Trường hợp thứ hai trong chỉ mục (trong trường hợp này B) không thể được sử dụng riêng biệt, nhưng trường hợp đầu tiên có thể (chỉ là trường hợp đầu tiên trong mọi trường hợp).

Vì vậy, nếu bạn không bao giờ sử dụng B một mình, thì index(A,B) phải đủ. Nếu bạn không bao giờ sử dụng A một mình, nhưng bạn sử dụng B, sau đó thực hiện index(B,A). Nếu bạn sử dụng cả hai cách riêng biệt, nhưng chủ yếu là với nhau, sau đó thêm chỉ mục khác một cách riêng biệt.

+0

Cảm ơn Topener, nhưng còn về truy vấn 2. 'ở đâu A> 3 và A < 10 and B > 12 và B <20'? Nó không phải là một trường hợp chỉ số riêng biệt cho B là cần thiết? – TMS

+0

đúng @Tomas –

1

Một chỉ mục trên (A,B) sẽ xử lý trường hợp của bạn 1, 3 và 4.

Đối với trường hợp 2, nơi bạn có một truy vấn phạm vi trên A và cũng trên B, nó là tốt nhất để có một chỉ mục trên (A), và một chỉ mục riêng biệt trên (B) và để cơ sở dữ liệu quyết định phương pháp nào là tốt nhất cho truy vấn. Nó có thể quyết định bay mà chỉ mục có nhiều chọn lọc hơn dựa trên các giá trị trong truy vấn. MySQL sẽ chỉ sử dụng một chỉ mục trong trường hợp này, vì vậy nó sẽ chọn một chỉ mục mà nó cho rằng sẽ cho nó một tập hợp các hàng nhỏ nhất cho phạm vi nhất định, và sau đó sẽ đi qua các hàng lọc theo phạm vi khác.

Vì vậy, để xử lý tất cả những trường hợp bạn nêu, tôi khuyên bạn nên chỉ số trên:

  • (A,B)
  • (B)

Chỉ số trên (A,B) có thể được sử dụng giống như một chỉ số chỉ trên (A) bất cứ khi nào cơ sở dữ liệu cần chỉ mục trên chỉ (A), do đó việc xác định hai chỉ mục đó giống như việc có một tập hợp "tất cả các bên trên" của (A), (B)(A,B).

Cũng lưu ý rằng nếu bạn muốn đặt hàng theo hoặc nhóm theo số (B, A), bạn sẽ muốn có chỉ mục trên (B,A) cũng như (A,B). Đặt hàng là quan trọng!

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