Làm cách nào để ước tính các thao tác I / O được thực hiện bởi các truy vấn MySQL?


13

Trên RDS của Amazon, bạn trả khoảng 0,10 đô la cho mỗi 1 triệu yêu cầu I / O. Tôi đã nhận thấy một số lượng rất cao (trong hàng trăm ngàn) yêu cầu I / O cho cơ sở dữ liệu lưu lượng truy cập rất thấp. Khi thấy điều này, tôi đã thực hiện một số nghiên cứu sâu hơn và nhận thấy câu hỏi này mô tả rằng đối với một trang web 6.000 người dùng, anh ta đã tạo ra 800 triệu yêu cầu I / O mỗi tháng, sẽ tiêu tốn của anh ta khoảng 80 đô la / tháng.

Do đó, tôi muốn biết trước có bao nhiêu thao tác I / O mà một truy vấn MySQL sẽ tạo ra và cách tối ưu hóa / thu nhỏ chúng. Có cách nào để ước tính có bao nhiêu thao tác I / O mà một truy vấn sẽ thực hiện và bất kỳ quy tắc chung nào tôi có thể tuân theo để giữ chúng ở mức thấp nhất có thể không?

Câu trả lời:


2

Câu trả lời Wiki cộng đồng được tạo ra từ các bình luận về câu hỏi của Raymond Nijland

Sử dụng EXPLAIN. Bằng cách này bạn có thể thấy nếu một truy vấn CÓ THỂ cần đĩa IO. Bạn cần tránh trong cột thêm "Sử dụng tạm thời" hoặc "" Sử dụng tạm thời; Sử dụng tập tinortort (lưu ý tập tin tập tin là một tên sai lệch: nếu tập kết quả phù hợp với bộ nhớ, quicksort được chạy trong bộ nhớ) ".

Điều này rất có thể được gây ra bởi các truy vấn con / hiệp hội / thứ tự theo / nhóm bởi / ... Nếu kết quả của bạn lớn và bảng tạm thời dựa trên đĩa MyISAM được tạo và bạn cần sắp xếp kết quả, bạn đang sắp xếp kết quả thiết lập dựa trên IO đọc và IO ghi với thuật toán quicksort.

Trong Bảng tạm thời nội bộ Sử dụng trong MySQL, bạn có thể đọc khi MySQL cần tạo bảng MyISAM dựa trên đĩa. Có lẽ bạn có thể sử dụng các hàng avg_row_length * (mặc dù lưu ý rằng giá trị hàng từ giải thích không chính xác với công cụ InnoDB) để kiểm tra xem kết quả có khớp với heap không. Xem Cú pháp SHOW TABLE STATUS .

Nói chung là InnoDB hoặc MyISAM tốt hơn để tránh các yêu cầu I / O?

InnoDB sẽ đệm dữ liệu bảng và dữ liệu chỉ mục, trong khi MyISAM chỉ đệm các khóa chỉ mục. Cần có I / O cho dữ liệu bảng khi giải thích thêm cột không nói "Sử dụng chỉ mục".

Nếu cả hai đều sử dụng chỉ mục: Với InnoDB, nếu bộ đệm nóng, nó có thể tải dữ liệu từ bộ nhớ. Nếu các chỉ mục cần đến từ đĩa, có một công thức mà bạn có thể sử dụng để tính toán các lần đọc IO cần thiết cho các lựa chọn, chèn và cập nhật. Từ ước tính hiệu suất truy vấn :

Đối với các bảng nhỏ, bạn thường có thể tìm thấy một hàng trong một đĩa tìm kiếm (vì chỉ mục có thể được lưu trong bộ nhớ cache). Đối với các bảng lớn hơn, bạn có thể ước tính rằng, bằng cách sử dụng các chỉ mục cây B, bạn cần nhiều tìm kiếm này để tìm một hàng:

log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1

Các chỉ mục của InnoDB lớn hơn vì nó lưu trữ dữ liệu từ khóa CHÍNH HÃNG / ĐỘC ĐÁO thành một chỉ mục KEY. Điều này nhanh hơn và cần ít hơn IO tìm kiếm nhưng bạn có thể nén dữ liệu hoặc chỉ mục của InnoDB.

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.