Điều gì để đặt innodb_buffer_pool và tại sao ..?


20

Tôi có 170GB InnoDBchỉ mục và dữ liệu.

Tôi phải điều chỉnh kích thước innodb_buffer_pool để có hiệu suất tốt hơn. Kích thước bảng tối đa của bảng InnoDB (Index + dữ liệu) là 28GB.

Vì vậy, kích thước tối ưu của innodb_buffer_pool là gì.

CẬP NHẬT

chúng tôi sẽ chuyển cơ sở dữ liệu cục bộ này sang ec2 vì vậy sẽ đặt RAM theo số liệu thống kê hiện tại của innodb đó là lý do tại sao tôi cần kích thước của vùng đệm để chúng tôi có thể có RAM ở đó.

Tệp Mỗi bảng được bật.

Tôi đang sử dụng máy Linux.


RAM có sẵn trên máy không được sử dụng bởi các quá trình khác là gì? Bạn đang sử dụng Windows, Linux hay cái gì khác? Bạn đang sử dụng phiên bản nào của MySQL? Tại sao kích thước bảng giới hạn ở 28GB?
Craig Efrein

Kích thước bảng không giới hạn..Tôi đã đưa kích thước của bảng lên đến một điểm thời gian. Nó sẽ tăng lên vì sẽ có chèn trong tương lai ..
Abdul Manaf

Câu trả lời:


25

Bảng lớn nhất bạn có chiếm 16,47% (28/170) trong tổng số dữ liệu. Ngay cả khi bảng được viết nhiều và đọc nhiều, không phải tất cả 28G của bảng được tải trong vùng đệm tại một thời điểm nhất định. Những gì bạn cần tính toán là bao nhiêu của Bộ đệm InnoDB được tải tại bất kỳ thời điểm nào trên Máy chủ DB hiện tại .

Dưới đây là một cách chi tiết hơn để xác định innodb_buffer_pool_size cho một Máy chủ DB mới được cung cấp bộ dữ liệu hiện được tải trong Nhóm bộ đệm InnoDB của DB Server hiện tại.

Chạy phần sau trên Instance MySQL hiện tại của bạn (máy chủ bạn đang di chuyển từ)

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

Chạy công thức IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages.

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

Nếu IBPPctFull từ 95% trở lên, bạn nên đặt innodb_buffer_pool_size thành 75% RAM của Máy chủ DB.

Nếu IBPPctFull nhỏ hơn 95%, hãy chạy công thức này : IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05.

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

Số cho IBPSize (tính bằng GB) là số phù hợp hơn với tập dữ liệu làm việc thực tế của bạn.

Bây giờ, nếu IBPSize vẫn còn quá lớn đối với Cấu hình RAM Amazon EC2 lớn nhất, hãy sử dụng 75% RAM cho Máy chủ DB Amazon EC2.


Đó là thông tin thực sự tuyệt vời..Một điều nữa tôi cần biết về cách Máy chủ MySQL tải dữ liệu và chỉ mục trong vùng đệm tôi đã xem qua tài liệu và nhận được rằng nó sử dụng LRU nhưng cách nó tải chúng vào bộ nhớ như thể tôi có 2GB cho vùng đệm nhưng kích thước bảng được yêu cầu trong truy vấn nhiều hơn thế .. ??
Abdul Manaf

Chỉ các trang dữ liệu và chỉ mục cần thiết để đáp ứng truy vấn được tải vào nhóm bộ đệm, không phải toàn bộ bảng. Các trang dữ liệu và chỉ mục cũ được xoay ra dựa trên thuật toán LRU được liệt kê trong dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
RolandoMyQueryDBA

Abdul, bạn nên đi với câu trả lời của Rolando, câu trả lời tốt hơn câu hỏi của bạn. Tôi sẽ viết lại câu trả lời của riêng tôi chỉ vì tôi cần phải rõ ràng hơn.
Craig Efrein

13

Tôi đang cung cấp câu trả lời này dưới dạng thông tin bổ sung cho câu trả lời của Rolando bên dưới.

Trước khi máy chủ được sản xuất

Tính toán innodb_buffer_pool_size dựa trên các bảng lớn nhất thường được sử dụng bởi MySQL. Để xác định các bảng lớn nhất dựa trên kích thước của chúng trong cơ sở dữ liệu, bạn có thể sử dụng tập lệnh này:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

Bây giờ chúng ta biết bảng nào lớn nhất trong cơ sở dữ liệu của mình, chúng ta cần xác định bảng nào được sử dụng thường xuyên nhất. Để làm điều đó, tôi sẽ sử dụng một chương trình định hình như Jet Profiler (JP) để xem bảng nào đang được truy cập nhiều nhất. JP sẽ cho bạn thấy những bảng nào đang được truy cập thường xuyên nhất. Đây là một ảnh chụp màn hình từ phần đó trong JP

nhập mô tả hình ảnh ở đây

Vì vậy, với suy nghĩ này, bây giờ tôi biết rằng bảng người dùng và giá thầu chiếm khoảng 640 MB dung lượng ổ đĩa, chúng được sử dụng rất thường xuyên theo JP và điều đó có nghĩa là MySQL sẽ lưu trữ các chỉ mục và dữ liệu của họ trong nhóm bộ đệm dưới dạng Rolando đề cập dưới đây trong ý kiến ​​của mình.

Để đảm bảo MySQL có đủ bộ nhớ để lưu trữ dữ liệu cho các bảng lớn nhất và được sử dụng thường xuyên nhất của tôi, sau đó tôi sẽ xác định innodb_buffer_pool_size ở 640MB.

Có một số cân nhắc bổ sung, nhưng chúng không áp dụng cho innodb_buffer_pool_size.

Đây là hệ thống 32Bit hay 64 bit? Trong hệ thống 32Bit, bạn bị giới hạn ở mức 4GB trừ khi bạn kích hoạt PAE. Trong Windows, điều này có nghĩa là chạy phiên bản Windows Enterprise hoặc Datacenter.

Các tiến trình khác đang chạy trên hệ thống của bạn cần bao nhiêu bộ nhớ? Trên một máy chủ MySQL chuyên dụng, tôi sẽ để lại từ 5% đến 10% cho HĐH. Trong Windows, bạn có thể sử dụng Process Explorer để phân tích việc sử dụng bộ nhớ. Trong Linux, bạn có sysstat, miễn phí, htop, top và vmstat.

Là cơ sở dữ liệu chỉ bao gồm các bảng Innodb hoặc hỗn hợp của Innodb và MyISAM? Nếu nó là hỗn hợp của cả hai, thì tôi sẽ đặt bộ nhớ cho key_cache, tham gia biến, bộ đệm truy vấn, v.v. Sau này, bạn có thể tính tỷ lệ trúng MyISAM của mình sau khi máy chủ được sản xuất.

Sau khi máy chủ được sản xuất.

Tỷ lệ trúng hiện tại của Innodb là gì?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_Vquests).

Tỷ lệ trúng bộ nhớ cache chính là gì

1 - (Key_reads / Key_read_Vquests)

Tôi thường cố gắng để có được tỷ lệ càng gần 100% càng tốt.

Làm thế nào tốt để bảng của bạn phù hợp trong vùng đệm

Bạn cũng có thể xem mức độ phù hợp của dữ liệu bảng trong bộ đệm của bạn bằng cách tham khảo liên kết này, cung cấp cách hiển thị "có bao nhiêu trang trong nhóm bộ đệm cho bảng đã cho (cnt), bao nhiêu trong số chúng bị bẩn (bẩn) và bao nhiêu phần trăm chỉ số phù hợp trong bộ nhớ (fit_pct). " Chỉ áp dụng cho máy chủ Percona

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-uits-in-innodb-buffer-pool/

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.