Tôi đã thực hiện rất nhiều nghiên cứu về cách duy trì các chỉ mục trong MySQL để ngăn chặn sự phân mảnh và tối ưu hóa bằng cách nào đó thực hiện một số truy vấn.
Tôi quen thuộc với công thức đó tính toán tỷ lệ giữa không gian tối đa có sẵn cho một bảng VS không gian được sử dụng bởi dữ liệu và chỉ mục.
Tuy nhiên, câu hỏi chính của tôi vẫn chưa được trả lời. Có lẽ điều này là do thực tế là tôi đã quen với việc bảo trì chỉ mục trong SQL Server và tôi có xu hướng nghĩ rằng trong MySQL nó phải giống nhau.
Trong máy chủ SQL, bạn có thể có một vài chỉ mục và mỗi chỉ mục có thể có các mức phân mảnh khác nhau. Sau đó, bạn có thể chọn một và thực hiện thao tác 'REORGANIZE' hoặc 'REBUILD' trong chỉ mục cụ thể đó mà không ảnh hưởng đến phần còn lại.
Theo hiểu biết tốt nhất của tôi, không có 'phân mảnh bảng' như vậy và SQL Server không cung cấp bất kỳ công cụ nào để khắc phục 'phân mảnh bảng'. Những gì nó cung cấp là các công cụ để kiểm tra phân mảnh chỉ mục (được hiểu như tỷ lệ giữa số lượng trang được sử dụng bởi một chỉ mục VS mức độ đầy đủ của trang đó và sự liên tục), cũng như phân mảnh bên trong và bên ngoài.
Tất cả điều đó khá đơn giản để hiểu, ít nhất là đối với tôi.
Bây giờ, khi đến lượt duy trì các chỉ mục trong MySQL, chỉ tồn tại khái niệm 'phân mảnh bảng, như đã đề cập ở trên.
Một bảng trong MySQL có thể có một vài chỉ mục, nhưng khi tôi kiểm tra 'tỷ lệ phân mảnh' với công thức nổi tiếng đó, tôi không thấy sự phân mảnh của từng chỉ mục, mà là toàn bộ bảng.
Khi tôi muốn tối ưu hóa các chỉ mục trong MySQL, tôi không chọn một chỉ mục cụ thể để hoạt động (như trong SQL Server). Thay vào đó, tôi thực hiện thao tác 'TỐI ƯU HÓA' trong toàn bộ bảng, điều này có lẽ ảnh hưởng đến tất cả các chỉ mục.
Khi bảng được tối ưu hóa trong MySQL, tỷ lệ giữa không gian được sử dụng bởi dữ liệu + chỉ mục VS không gian tổng thể bị giảm, điều này cho thấy một số loại tổ chức lại vật lý trong ổ cứng, giúp chuyển thành giảm không gian vật lý. Tuy nhiên, phân mảnh chỉ mục không chỉ về không gian vật lý, mà cấu trúc của cây đã bị thay đổi theo thời gian do chèn và cập nhật.
Cuối cùng, tôi đã nhận được một bảng trong InnoDB / MySQL. Bảng đó có 3 triệu bản ghi, 105 cột và 55 chỉ mục. Đó là 1,5 GB không bao gồm các chỉ mục, là 2,1 GB.
Bảng đó đang được nhấn hàng ngàn lần mỗi ngày để cập nhật, chèn (chúng tôi không thực sự xóa các bản ghi).
Bảng đó đã được tạo ra trong nhiều năm và tôi biết chắc chắn rằng không ai duy trì chỉ số nào.
Tôi đã mong đợi để tìm thấy một sự phân mảnh lớn trong đó, nhưng khi tôi thực hiện tính toán phân mảnh theo quy định
free_space / (data_length + index_length)
Hóa ra tôi chỉ có phân mảnh 0,2%. IMHO đó là khá phi thực tế.
Vì vậy, những câu hỏi lớn là:
- Làm cách nào để kiểm tra sự phân mảnh của một chỉ mục cụ thể trong MySQL, chứ không phải toàn bộ bảng
- Liệu TỐI ƯU BẢNG có thực sự khắc phục sự phân mảnh bên trong / bên ngoài của một chỉ mục như trong SQL Server không?
- Khi tôi tối ưu hóa một bảng trong MySQL, nó có thực sự xây dựng lại tất cả các chỉ mục trên bảng không?
- Có thực tế không khi nghĩ rằng việc giảm không gian vật lý của một chỉ mục (mà không xây dựng lại chính cây) thực sự chuyển thành một hiệu suất tốt hơn?