mysql quá nhiều chỉ mục?


82

Tôi đang dành thời gian tối ưu hóa cơ sở dữ liệu hiện tại của chúng tôi.

Tôi đang xem xét các chỉ mục cụ thể.

Có một số câu hỏi:

  • Có một điều như là quá nhiều chỉ mục?
  • Điều gì sẽ tăng tốc các chỉ mục?
  • Điều gì sẽ làm chỉ số chậm lại?
  • Khi nào thì nên thêm một chỉ mục?
  • Khi nào thì nên thêm một chỉ mục?
  • Pro và Con của nhiều chỉ mục so với chỉ mục nhiều cột?

Câu trả lời:


148

Điều gì sẽ tăng tốc các chỉ mục?

Truy xuất dữ liệu - Các câu lệnh SELECT.

Điều gì sẽ làm chỉ số chậm lại?

Thao tác dữ liệu - câu lệnh INSERT, UPDATE, DELETE.

Khi nào thì nên thêm một chỉ mục?

Nếu bạn cảm thấy muốn có được hiệu suất truy xuất dữ liệu tốt hơn.

Khi nào thì nên thêm một chỉ mục?

Trên các bảng sẽ thấy thao tác dữ liệu nặng - chèn, cập nhật ...

Pro và Con của nhiều chỉ mục so với chỉ mục nhiều cột?

Các truy vấn cần giải quyết thứ tự của các cột khi xử lý một chỉ mục bao trùm (một chỉ mục trên nhiều cột), từ trái sang phải trong định nghĩa cột chỉ mục. Thứ tự cột trong câu lệnh không quan trọng, chỉ có cột 1, 2 và 3 - một câu lệnh cần có tham chiếu đến cột 1 trước khi chỉ mục có thể được sử dụng. Nếu chỉ có tham chiếu đến cột 2 hoặc 3, không thể sử dụng chỉ mục bao trùm cho 1/2/3.

Trong MySQL, chỉ một chỉ mục có thể được sử dụng cho mỗi câu lệnh SELECT / trong truy vấn (truy vấn con / vv được xem như một câu lệnh riêng biệt). Và có một giới hạn về số lượng không gian trên mỗi bảng mà MySQL cho phép. Ngoài ra, việc chạy một hàm trên một cột được lập chỉ mục làm cho chỉ mục trở nên vô dụng - IE:

WHERE DATE(datetime_column) = ...

11
wow, thông tin này thực sự có cấu trúc tuyệt vời và rất hữu ích! Và điều hữu ích nhất đối với tôi là một chỉ mục trong đó một hàm được áp dụng là vô ích ... cảm ơn bạn vì câu trả lời này!
Chris

2
@OMG, Về đoạn cuối cùng của bạn, Có thể sử dụng nhiều hơn một chỉ mục selectdo hợp nhất chỉ mục. percona.com/blog/2012/12/14/…
Pacerier

1
-1 để nói (1) nó chỉ tăng tốc độ "CHỌN", nó sẽ tăng tốc độ các truy vấn CHỌN, CẬP NHẬT và XÓA, với điều kiện là các chỉ mục được tạo chính xác theo các điều kiện "WHERE", nhưng yêu cầu các chỉ mục cập nhật về thao tác dữ liệu có nghĩa là rằng chỉ các truy vấn INSERT sẽ chậm hơn (trong mọi trường hợp) so với không có chỉ mục và (2) để nói rằng MySQL chỉ có thể sử dụng một chỉ mục tại một thời điểm.
Patrick Allaert

Tương tự như @PatrickAllaert -1 vì thông tin sai lệch về cập nhật, xóa
Eimsas 13/11/19

64

Tôi không đồng ý với một số câu trả lời về câu hỏi này.

Có một điều như là quá nhiều chỉ mục?

Tất nhiên. Không tạo chỉ mục không được sử dụng bởi bất kỳ truy vấn nào của bạn. Đừng tạo các chỉ mục thừa. Sử dụng các công cụ như pt-trùng lặp-key-checkerpt-index-using để giúp bạn khám phá các chỉ mục mà bạn không cần.

Điều gì sẽ tăng tốc các chỉ mục?

  • Điều kiện tìm kiếm trong mệnh đề WHERE.
  • Điều kiện tham gia.
  • Một số trường hợp ORDER BY.
  • Một số trường hợp GROUP BY.
  • Ràng buộc DUY NHẤT.
  • Ràng buộc NGOẠI KHÓA.
  • Tìm kiếm FULLTEXT.

Các câu trả lời khác đã khuyên rằng INSERT / UPDATE / DELETE càng chậm khi bạn có nhiều chỉ mục hơn. Điều đó đúng, nhưng hãy xem xét rằng nhiều cách sử dụng UPDATE và DELETE cũng có mệnh đề WHERE và trong MySQL, UPDATE và DELETE cũng hỗ trợ JOIN. Chỉ mục có thể có lợi cho những truy vấn này hơn là bù đắp chi phí cập nhật chỉ mục.

Ngoài ra, InnoDB khóa các hàng bị ảnh hưởng bởi CẬP NHẬT hoặc XÓA. Họ gọi đây là khóa cấp độ hàng, nhưng nó thực sự là khóa cấp chỉ mục. Nếu không có chỉ mục để thu hẹp tìm kiếm, InnoDB phải khóa nhiều hàng hơn hàng cụ thể mà bạn đang thay đổi. Nó thậm chí có thể khóa tất cả các hàng trong bảng. Các khóa này chặn các thay đổi được thực hiện bởi các máy khách khác, ngay cả khi chúng không xung đột về mặt logic.

Khi nào thì nên thêm một chỉ mục?

Nếu bạn biết bạn cần chạy một truy vấn có lợi từ một chỉ mục trong một trong các trường hợp trên.

Khi nào thì nên thêm một chỉ mục?

Nếu chỉ mục là tiền tố bên trái của một chỉ mục hiện có khác hoặc chỉ mục không giúp bất kỳ truy vấn nào bạn cần chạy.

Pro và Con của nhiều chỉ mục so với chỉ mục nhiều cột?

Trong một số trường hợp, MySQL có thể thực hiện tối ưu hóa hợp nhất chỉ mục và kết hợp hoặc cắt các kết quả từ các tìm kiếm chỉ mục độc lập. Nhưng nó mang lại hiệu suất tốt hơn để xác định một chỉ mục duy nhất nên việc hợp nhất chỉ mục không cần phải thực hiện.

Đối với một trong những khách hàng tư vấn của tôi, tôi đã xác định một chỉ mục nhiều cột trên một bảng nhiều cột trong đó không có chỉ mục nào và cải thiện truy vấn kết hợp của họ với hệ số 94 triệu!

Thiết kế các chỉ mục phù hợp là một quá trình phức tạp, dựa trên các truy vấn bạn cần để tối ưu hóa . Bạn không nên đưa ra các quy tắc rộng như "lập chỉ mục mọi thứ" hoặc "không lập chỉ mục gì để tránh làm chậm cập nhật".

Xem thêm bài thuyết trình của tôi về Cách thiết kế chỉ mục, Thực sự .


10
+1 cho "... hãy cân nhắc rằng nhiều cách sử dụng UPDATE và DELETE cũng có mệnh đề WHERE và trong MySQL, UPDATE và DELETE cũng hỗ trợ JOIN. Các chỉ mục có thể có lợi cho các truy vấn này hơn là bù đắp chi phí cập nhật chỉ mục."
Rob Craig

1
Đây phải là câu trả lời được chấp nhận vì đã thực hiện các điều khoản được xem xét trong cập nhật và xóa.
Leonardo Emilio Dominguez

1
Đây là câu trả lời đúng, câu trả lời được đánh dấu là đúng là sai.
Eimsas

7

Có một điều như là quá nhiều chỉ mục?

Các chỉ mục phải được thông báo bởi vấn đề đang xảy ra: các bảng, các truy vấn mà ứng dụng của bạn sẽ chạy, v.v.

Điều gì sẽ tăng tốc các chỉ mục?

LỰA CHỌN.

Điều gì sẽ làm chỉ số chậm lại?

INSERTs sẽ chậm hơn, vì bạn phải cập nhật chỉ mục.

Khi nào thì nên thêm một chỉ mục?

Khi ứng dụng của bạn cần điều khoản WHERE khác.

Khi nào thì nên thêm một chỉ mục?

Khi bạn không cần nó để truy vấn hoặc thực thi các ràng buộc về tính duy nhất.

Ưu và nhược điểm của nhiều chỉ mục so với chỉ mục nhiều cột?

Tôi không hiểu câu hỏi. Nếu bạn có một ràng buộc về tính duy nhất bao gồm nhiều cột, hãy lập mô hình nó như vậy.


4

Có một điều như là quá nhiều chỉ mục?

Đúng. Đừng ra ngoài tìm kiếm để tạo chỉ mục, hãy tạo chúng khi cần thiết.

Điều gì sẽ tăng tốc các chỉ mục?

Bất kỳ truy vấn nào đối với bảng / chế độ xem chỉ mục.

Điều gì sẽ làm chỉ số chậm lại?

Bất kỳ câu lệnh INSERT nào so với bảng đã lập chỉ mục sẽ bị chậm lại, vì mỗi bản ghi mới sẽ cần được lập chỉ mục.

Khi nào thì nên thêm một chỉ mục?

Khi truy vấn không chạy ở tốc độ chấp nhận được. Bạn có thể đang lọc các bản ghi không phải là một phần của PK nhóm, trong trường hợp đó, bạn nên thêm các chỉ mục dựa trên các bộ lọc bạn đang tìm kiếm (nếu hiệu suất cho là phù hợp).

Khi nào thì nên thêm một chỉ mục?

Khi bạn làm điều đó vì lợi ích của nó - tức là tối ưu hóa quá mức.

Pro và Con của nhiều chỉ mục so với chỉ mục nhiều cột?

Phụ thuộc vào các truy vấn bạn đang cố gắng cải thiện.


3

Có một điều như là quá nhiều chỉ mục?

Yup, giống như tất cả mọi thứ, quá nhiều chỉ mục sẽ làm chậm quá trình thao tác dữ liệu.

Khi nào thì nên thêm một chỉ mục?

Một ý tưởng hay để thêm chỉ mục là khi các truy vấn của bạn quá chậm (tức là bạn có quá nhiều liên kết trong các truy vấn của mình). Bạn chỉ nên sử dụng tối ưu hóa này sau khi bạn đã xây dựng một mô hình vững chắc, để điều chỉnh hiệu suất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.