Chúng ta đã thảo luận về cách cấu hình InnoDB để có hiệu suất cao cách đây một lúc, tuy nhiên, chúng ta vẫn chưa thảo luận về cách chúng ta có thể cải thiện hiệu suất MySQL trong khi sử dụng các cài đặt InnoDB nâng cao. Bài đăng trên blog này sẽ cung cấp thêm một chút thông tin chi tiết về chủ đề này.
Giải thích về InnoDB
Trước khi thực sự đi sâu hơn vào cài đặt InnoDB, có lẽ chúng ta nên hiểu những điều cơ bản:InnoDB là một công cụ lưu trữ cho MySQL, MariaDB và Percona Server. Công cụ này được gọi là Plugin InnoDB, yêu cầu thiết lập và cài đặt trình cắm. Cho đến khi phát hành MySQL 5.5.5, InnoDB không còn là một plugin nữa và hiện là một phần của gói MySQL với tư cách là một trong những công cụ lưu trữ được hỗ trợ cho MySQL. Kể từ khi phát hành MySQL 5.6, InnoDB đã trở thành công cụ lưu trữ mặc định - đó là công cụ lưu trữ có mục đích chung cân bằng giữa độ tin cậy cao và hiệu suất cao. Các ưu điểm chính của InnoDB bao gồm hỗ trợ khóa cấp độ hàng, khóa ngoại và tuân theo mô hình ACID (Độ bền cách ly nguyên tử) - ACID là một tập hợp các thuộc tính nhằm đảm bảo tính hợp lệ của dữ liệu bất chấp lỗi, mất điện và các vấn đề khác. InnoDB có một danh sách phong phú các biến và một số biến trong số này giúp cải thiện hiệu suất, đặc biệt là về loại phần cứng và tài nguyên sẵn có của máy chủ cơ sở dữ liệu của bạn. Trong số này có:
- innodb_data_file_path là tệp lưu trữ dữ liệu từ các bảng InnoDB.
- innodb_buffer_pool_size là bộ đệm bộ nhớ mà InnoDB sử dụng để lưu dữ liệu và chỉ mục của các bảng trong bộ nhớ cache.
- innodb_log_file_size mô tả kích thước của tệp nhật ký InnoDB. Innodb_log_file_size càng lớn thì thời gian khôi phục bạn cần trong trường hợp gặp sự cố càng lâu.
- innodb_log_buffer_size được InnoDB sử dụng để ghi vào các tệp nhật ký trên đĩa.
- innodb_flush_log_at_trx_commit kiểm soát sự cân bằng giữa hiệu suất và tuân thủ ACID. Giá trị mặc định là 1, giúp giữ cho InnoDB ACID tuân thủ - chuyển innodb_flush_log_at_trx_commit thành 2 sẽ có tốc độ ghi rất nhanh nhưng có thể mất giá trị giao dịch trong một giây.
Ngoài ra còn có các cài đặt InnoDB nâng cao có thể được đặt để cải thiện hiệu suất MySQL hơn nữa. Chúng tôi sẽ xem xét chúng ngay bây giờ.
Cài đặt InnoDB Nâng cao
Như đã lưu ý ở trên, InnoDB có các cài đặt nâng cao có thể được sử dụng để cải thiện hơn nữa hiệu suất của nó (chúng tôi sẽ không liệt kê hoàn toàn tất cả chúng, nhưng các cài đặt được liệt kê sẽ cung cấp cho bạn khá tốt ý tưởng về việc InnoDB thực sự mạnh mẽ như thế nào):
- InnoDB có thể bị tắt - nếu bạn muốn vô hiệu hóa InnoDB, chỉ cần sửa đổi tệp my.cnf và thêm bỏ qua-innodb trong phần [mysqld]. Sau đó, khởi động lại máy chủ MySQL của bạn - InnoDB bây giờ sẽ bị vô hiệu hóa. Ngoài ra, bạn có thể sử dụng tùy chọn --innodb:đặt nó thành TẮT sẽ tắt động cơ. Mặc dù vậy, xin lưu ý rằng các tùy chọn này không được chấp nhận kể từ MySQL 5.7.5.
- InnoDB cũng cung cấp cơ chế khóa có thể định cấu hình có thể cải thiện hiệu suất của các câu lệnh SQL để thêm hàng vào bảng có cột AUTO_INCREMENT:các chế độ tự động tăng có thể được định cấu hình khi khởi động bằng cách sử dụng tùy chọn innodb_autoinc_lock_mode. Tùy chọn có ba cài đặt để chỉ định chế độ khóa - chế độ khóa có thể là 0 (“truyền thống”), 1 (“liên tiếp”) hoặc 2 (“xen kẽ”). Giá trị cung cấp hiệu suất tùy thuộc vào loại chèn cơ sở dữ liệu. Nói ngắn gọn, 0 cung cấp khả năng tương thích với các phiên bản MySQL và Innodb cũ hơn. Giá trị 1 cung cấp phương pháp tiếp cận xác định và an toàn hơn để sao chép dựa trên tuyên bố (SBR). Trong khi giá trị của 2 có chế độ khóa có thể mở rộng hơn và nhanh nhất nhưng các hàng được chèn bởi bất kỳ câu lệnh nhất định nào có thể không liên tiếp. Tham khảo tài liệu MySQL để biết thêm thông tin.
- InnoDB cung cấp cho bạn khả năng chia vùng đệm thành nhiều phân đoạn (tính năng này chỉ có sẵn từ MySQL 5.5) - cài đặt innodb_buffer_pool_instances cho phép bạn cải thiện khả năng mở rộng của MySQL trên các máy chạy nhiều lõi. Theo mặc định, giá trị của cài đặt này là 1 nếu innodb_buffer_pool_size nhỏ hơn 1GB và 8 nếu không:số chỉ định số vùng mà vùng đệm InnoDB được chia thành. Cài đặt này có thể được sử dụng để thu hút nhiều lõi hơn, chúng tôi sẽ giải thích cách thực hiện sau.
- InnoDB cung cấp bốn mức cách ly giao dịch (tx_isolation trong <5.7 nhưng giao dịch_isolation trong phiên bản 5.7 trở đi):READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ và SERIALIZABLE:các mức cách ly này là "I" trong từ viết tắt ACID :
- Khi sử dụng READ UNCOMMITTED, một giao dịch có thể thấy các thay đổi chưa được cam kết bởi một giao dịch khác. Mức độ cách ly này cho phép đọc bẩn.
- Khi sử dụng READ COMMITTED, bạn có thể yên tâm rằng mọi dữ liệu đã được đọc đều được cam kết tại thời điểm đọc.
- Khi sử dụng REPEATABLE READ, mức cách ly cao hơn sẽ được sử dụng. Ngoài mọi thứ được đảm bảo bởi cấp READ COMMITTED, nó cũng đảm bảo rằng mọi dữ liệu đã được đọc đều không thể thay đổi.
- Khi sử dụng SERIALIZABLE, mức độ cách ly thậm chí còn cao hơn sẽ được sử dụng. Ngoài mọi thứ được đảm bảo bởi mức cách ly REPEATABLE READ, nó cũng đảm bảo rằng không có dữ liệu mới nào có thể được nhìn thấy trong các lần đọc tiếp theo.
- InnoDB cũng cho phép bạn xác định dung lượng I / O tổng thể có sẵn cho InnoDB bằng cách sửa đổi biến innodb_io_capacity. Giá trị của biến này nên được đặt thành xấp xỉ số IOPS mà hệ thống có thể thực hiện mỗi giây:khi đặt giá trị của thông số này, hãy nhớ rằng các giá trị xung quanh 100 phù hợp hơn với HDD, trong khi SSD có thể được hưởng lợi từ các giá trị cao hơn . Biến innodb_io_capacity_max cũng có thể được hỗ trợ:biến này cho phép InnoDB xả mạnh hơn, có nghĩa là tốc độ của các hoạt động I / O có thể vượt quá giới hạn được xác định bởi innodb_io_capacity - trong những trường hợp như vậy, các hoạt động sẽ không vượt quá giá trị được xác định bởi biến innodb_io_capacity_max .
- InnoDB cũng cho phép bạn kiểm soát số lượng luồng nền có sẵn cho các hoạt động I / O:số luồng I / O được phân bổ cho các hoạt động đọc có thể được kiểm soát bởi biến innodb_read_io_threads trong khi số lượng I / Các luồng O được phân bổ cho các hoạt động ghi có thể được điều khiển bởi biến innodb_write_io_threads. Giá trị mặc định cho cả hai tham số này là 4 và giá trị tối đa cho phép là 64.
- InnoDB có khả năng biến một số cảnh báo InnoDB thành lỗi:để làm như vậy, chỉ cần đặt biến innodb_strict_mode thành BẬT:biến này ảnh hưởng đến việc xử lý lỗi cú pháp cho các hoạt động CREATE TABLE, ALTER TABLE và CREATE INDEX :vô hiệu hóa biến này có thể giải quyết lỗi "Kích thước hàng quá lớn". Để tắt chế độ nghiêm ngặt, hãy đặt innodb_strict_mode thành TẮT.
- InnoDB có thể được bảo vệ phần nào chống lại việc quét toàn bộ bảng can thiệp vào dữ liệu được lưu trong bộ đệm bằng cách tăng biến innodb_old_blocks_time. Giá trị tối thiểu cho cài đặt này là 0, giá trị mặc định là 1000.
- Nếu bạn chạy các hoạt động bảo trì trên bảng InnoDB có chứa chỉ mục FULLTEXT, hãy cân nhắc chuyển biến innodb_optimize_fulltext_only thành ON - sau khi biến này được bật, truy vấn OPTIMIZE TABLE sẽ chạy nhanh hơn vì nó sẽ bỏ qua việc sắp xếp lại dữ liệu trong bàn. Lưu ý rằng cài đặt này chỉ được bật tạm thời nên bạn có thể muốn tắt cài đặt này sau khi quá trình tối ưu hóa hoàn tất.
- Để khởi động InnoDB ở chế độ chỉ đọc, hãy bật cài đặt innodb_read_only. Khi cài đặt này được bật, bạn có thể truy vấn bảng InnoDB trong đó thư mục dữ liệu MySQL nằm trên phương tiện chỉ đọc.
Làm cho InnoDB thu hút nhiều cốt lõi hơn
Bạn cũng có thể làm cho InnoDB thu hút nhiều lõi hơn bằng cách tận dụng khả năng đa luồng của nó:đáng ngạc nhiên là điều này không quá khó để đạt được - bạn chỉ cần sửa đổi một vài cài đặt. Đây là cách thực hiện điều đó:
- Để tùy chọn innodb_thread_concurrency ở giá trị mặc định là 0. Bằng cách đó, bạn cho phép InnoDB quyết định số lượng vé đồng thời tốt nhất (chúng xác định số lượng luồng có thể nhập đồng thời InnoDB) để mở cho một MySQL nhất định thiết lập phiên bản. Đối với MariaDB bắt đầu từ 10.5, nó được đánh dấu là không được dùng nữa vì vậy việc đặt giá trị này thành 0 sẽ rất hợp lý đối với MySQL vì tài nguyên máy tính đã phức tạp hơn so với những ngày đầu của MySQL.
- Sau khi tùy chọn innodb_thread_concurrency được đặt thành 0, hãy đặt cả innodb_read_io_threads và innodb_write_io_threads thành giá trị tối đa là 64. Điều này sẽ thu hút nhiều lõi hơn.
Tóm tắt
Tóm lại, InnoDB là một công cụ lưu trữ cực kỳ mạnh mẽ. Hiệu suất của công cụ lưu trữ này bị ảnh hưởng trực tiếp bởi các cài đặt mà công cụ này đang sử dụng. Vì vậy, nếu bạn muốn cải thiện hiệu suất của phiên bản MySQL của mình, hãy nhớ ghi nhớ ít nhất một vài mẹo được đề cập trong bài viết này. Điều chỉnh các cài đặt liên quan đến động cơ và sử dụng chúng khi thích hợp, làm như vậy sẽ mang lại lợi thế cho bạn.