Làm cách nào để xác định sort_buffer_size tối ưu?


10

Tôi đọc từ một tập tin cấu hình mẫu có nội dung như sau:

# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.

Tôi có một vài truy vấn sử dụng filesort. Làm cách nào để xác định kích thước của bộ đệm tôi cần để các truy vấn chạy trơn tru mà không cần nhấn vào đĩa?


Bạn có chạy mysqltuner hoặc tun -primer Bạn có thể thấy điều gì đó thú vị về my.cnf của bạn trong các ứng dụng này.
David Martinez

Câu trả lời:


14

Chỉ có một biến trạng thái quan tâm đến sort_buffer_size . Đó là những gì bạn có trong tin nhắn trở lại trong câu hỏi: Sort_merge_passes . Tài liệu MySQL nói:

Sort_merge_passes: Số lượng các phép hợp nhất mà thuật toán sắp xếp phải thực hiện. Nếu giá trị này lớn, bạn nên xem xét tăng giá trị của biến hệ thống sort_buffer_size .

Hãy ghi nhớ một điều về sort_buffer_size

Nếu bạn thấy nhiều đầu ra Sort_merge_passes mỗi giây trong đầu ra SHOW GLOBAL STATUS, bạn có thể xem xét tăng giá trị sort_buffer_size để tăng tốc các thao tác ORDER BY hoặc GROUP BY không thể cải thiện bằng tối ưu hóa truy vấn hoặc lập chỉ mục được cải thiện

Mặc dù việc nâng cao sort_buffer_sizecó thể giúp truy vấn với GROUP BYs và ORDER BYs, nhưng tốt hơn hết là bạn nên cải thiện các truy vấn mà bạn có thể cải thiện và thêm các chỉ mục có thể được Trình tối ưu hóa truy vấn sử dụng.

Câu hỏi vẫn còn: Làm thế nào để bạn kiểm tra Sort_merge_passes ???

Sử dụng mã này, để kiểm tra số lượng Sort_merge_passes đã xảy ra trong 5 phút qua. Nó cũng tính toán Sort_merge_passes mỗi giờ.

SET @SleepTime = 300;
SELECT variable_value INTO @SMP1
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SELECT SLEEP(@SleepTime) INTO @x;
SELECT variable_value INTO @SMP2
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SET @SMP = @SMP2 - @SMP1;
SET @SMP_RATE = @SMP * 3600 / @SleepTime;
SELECT @SMP,@SMP_RATE;

Nếu bạn tìm thấy Sort_merge_passes và tốc độ quá cao, thì hãy thoải mái tăng sort_buffer_size . Giả sử bạn muốn tăng lên 4M. Bạn sẽ chạy cái này:

mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;

Sau đó, bạn sẽ thêm nó vào my.cnf

[mysqld]
sort_buffer_size = 4M

Bạn sẽ chạy mã định kỳ để kiểm tra các lần khác Sort_merge_passes gai.


2
Đây là câu trả lời tốt hơn nhiều
Greg

7
@RolanoMySQLDBA bạn có thể định nghĩa "nhiều" trong phần sau: "Nếu bạn thấy nhiều Sort_merge_passes mỗi giây"
Tarek

2

Bạn không cần thay đổi sort_buffer_size từ mặc định. Bạn hiểu nhầm nó sử dụng dựa trên câu hỏi. Bạn nên bắt đầu bằng cách kiểm tra SQL để xem liệu bạn có thể điều chỉnh nó hay không và đáp ứng các điều kiện ORDER BY / GROUP BY bằng cách sử dụng một chỉ mục. Nó thường sẽ là một chỉ số tổng hợp.

Hơn nữa: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/


Xin lỗi để nói rằng tôi thấy bài viết đó hầu như không hữu ích. Nó giống như nói với mọi người đừng làm điều gì đó chỉ vì bạn không phải là một chuyên gia. Như được chỉ ra bởi người bình luận đầu tiên, các .cnftệp mẫu được gửi cùng với mysql không sử dụng cài đặt mặc định.
Câu hỏi tràn

Nếu bạn đọc lại nó cũng nói rằng chuyên gia đã biết không thay đổi giá trị từ mặc định. Các tệp .cnf mẫu không nên được sử dụng hoặc được tham chiếu là thông lệ tốt. Nếu bạn cần trợ giúp xây dựng tập tin my.cnf, Percona cung cấp một trình hướng dẫn khá kỹ lưỡng. tools.percona.com/wizard
eroomydna

2

Hướng dẫn trong hướng dẫn sử dụng (5.0-5.5) là

Nếu bạn thấy nhiều đầu ra Sort_merge_passes mỗi giây trong đầu ra SHOW GLOBAL STATUS, bạn có thể xem xét tăng giá trị sort_buffer_size để tăng tốc các thao tác ORDER BY hoặc GROUP BY không thể cải thiện bằng tối ưu hóa truy vấn hoặc lập chỉ mục được cải thiện. Toàn bộ bộ đệm được phân bổ ngay cả khi nó không phải là tất cả cần thiết, do đó, đặt nó lớn hơn yêu cầu trên toàn cầu sẽ làm chậm hầu hết các truy vấn sắp xếp. Tốt nhất là tăng nó dưới dạng cài đặt phiên và chỉ dành cho các phiên cần kích thước lớn hơn. Trên Linux, có các ngưỡng 256KB và 2MB trong đó các giá trị lớn hơn có thể làm chậm đáng kể việc cấp phát bộ nhớ, vì vậy bạn nên xem xét ở dưới một trong những giá trị đó. Thử nghiệm để tìm giá trị tốt nhất cho khối lượng công việc của bạn.

Từ 5.6 trở đi, từ ngữ chỉ ra rằng trình tối ưu hóa có thể chọn một giá trị cho truy vấn và máy chủ có thể mở rộng bộ đệm lên đến giới hạn. Điều này giảm thiểu chi phí thiết lập giá trị quá cao. Vì vậy, có vẻ như bạn có thể muốn bảo thủ, thấp hơn mức mặc định (Như các tệp cnf phát hành) cho các bản phát hành dưới 5.6.4 nhưng có thể có giới hạn cao hơn là 2MB mặc định, hoặc thậm chí nhiều hơn, từ 5.6. 4 như toàn bộ số tiền không được phân bổ một cách mù quáng.

Kể từ MySQL 5.6.4, trình tối ưu hóa cố gắng tìm ra dung lượng cần thiết nhưng có thể phân bổ nhiều hơn, đến giới hạn.


1

Cách tốt nhất để xác định tối ưu sort_buffer_sizelà điểm chuẩn nó.

Làm sao? Giống như @RolandoMySQLDBA cho biết việc kiểm tra Sort_merge_passescó thể hữu ích, nhưng đó không phải là yếu tố duy nhất ảnh hưởng đến hiệu suất. Bạn nên cẩn thận khi bạn tăng sort_buffer_size.

Tài liệu nói rằng

Trên Linux, có các ngưỡng 256KB và 2MB trong đó các giá trị lớn hơn có thể làm chậm đáng kể việc cấp phát bộ nhớ, vì vậy bạn nên xem xét ở dưới một trong những giá trị đó.

một bài về thử nghiệm mà kết luận rằng

sort_merge_passeskhông phải là xấu Đặt sort_buffer_sizemức đủ lớn của bạn để có 0 sort_merge_passescó thể không tối ưu.

Khi tôi kiểm tra, tôi cũng nhận được một kết quả tương tự.

Lý tưởng nhất, tốt nhất là tránh tình huống mà bạn cần tối ưu hóa sort_buffer_size. Làm sao? Tài liệu ORDER BY Tối ưu hóa này có thể giúp bạn hiểu cách mọi thứ hoạt động dưới mui xe.


-1

"mysql THIẾT LẬP TOÀN CẦU sort_buffer_size = 1024 * 1024 * 4;" Đây là một cách tồi để đặt kích thước bộ đệm sắp xếp vào 4m, điều đó làm cho kích thước bộ đệm sắp xếp có 4GB sử dụng

"mysql THIẾT LẬP TOÀN CẦU sort_buffer_size = 1024 * 4;"

Nếu tôi là của bạn, tôi không cố gắng thay đổi kích thước bộ đệm ngắn, đó là một cách tốt để làm sập máy chủ của bạn và gửi đến hiệu suất rác. Tốt hơn hết là cố gắng thực hiện các truy vấn tốt hơn.


1
Làm thế nào bất kỳ sắp xếp lớn có thể xảy ra trong một bộ đệm sắp xếp 4K? Lưu ý rằng bạn đã nói 1024 * 4. Đó là 4096, 4K.
RolandoMySQLDBA

Rolando đã nói gì ^^. Và giá trị tối thiểu được phép là 32K.
ypercubeᵀᴹ
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.