Tôi đang cố gắng khám phá lý do tại sao mysqld đôi khi làm bão hòa cpu và quầy hàng.chẩn đoán và tránh đột biến CPU cpu
Tôi cho rằng đó là điều cần làm với việc cập nhật chỉ mục hoặc việc bảo trì khác như vậy. Tôi muốn chứng minh giả thuyết này và xem xét các tùy chọn để tránh nó.
Đây là tình huống. Tôi có hàng chục bảng, nhưng dựa trên hoạt động, có vẻ như có ít nhất hai bảng nhất quán phải chịu đựng điều này. Hãy gọi cho họ Big
và Small
. Big
chứa khoảng 6.000 hàng tổng cộng 1Mb (vì vậy không phải tất cả những gì lớn) và Small
có hàng chục hàng, khoảng 50 byte mỗi hàng. Big
có khóa ngoài là Small
(InnoDB, trên xóa tầng, không phải null).
Có hai tình huống dường như kích hoạt sự cố: a) sửa đổi giá trị Big.small_id
hoặc b) thêm hàng vào Small
.
Tôi sẽ trực giác mong đợi a) khá nhanh chết tiệt, O(log(size of Big))
và b) hầu như tức thì vì Small
quá nhỏ và không có tham chiếu nào của Big
đối với nó đã thay đổi.
Trong mỗi trường hợp, lệnh SELECT tiếp theo nhận được thứ gì đó như hai mươi gigacycles (!); cái sau đó không mất thời gian chút nào. Có những bảng khác có khóa ngoài cho cả hai bảng này, nhưng tất cả đều khá nhỏ và tôi cho rằng chúng không chịu trách nhiệm về sự tăng đột biến này.
Làm cách nào tôi có thể tìm ra chỉ mục MySQL đang cập nhật và thời gian mất bao lâu?
Hoặc, nếu nó không cập nhật chỉ mục, làm thế nào tôi có thể tìm hiểu những gì khác mất quá nhiều thời gian?
Cuối cùng, tôi có thể thiết lập mysqld để ưu tiên luồng thấp hơn cho tác phẩm này và/hoặc tạm thời vô hiệu hóa chỉ mục để cho phép các mục không được lập chỉ mục (không chặn) xảy ra đồng thời với tác vụ bảo trì không?
HIỂN THỊ processlist cho thấy một truy vấn là trong "Gửi dữ liệu" nhà nước trong một thời gian dài. Nó không mô tả nhiều hơn thế. Tôi nghi ngờ đó là một nhãn hiệu hợp lý bởi vì tôi đang trên localhost, transmisison không phải là một nút cổ chai. Nơi nào tôi đi từ đây? Cảm ơn – spraff