2009-07-22 11 views
9

Sau đây là tệp cấu hình MySQL sản xuất mặc định của tôi (my.cnf) để thiết lập UTF-8 thuần túy với InnoDB làm công cụ lưu trữ mặc định.Cấu hình MySQL tối ưu (my.cnf)

[server] 
bind-address=127.0.0.1 
innodb_file_per_table 
default-character-set=utf8 
default-storage-engine=innodb 

Quá trình cài đặt nào sau đây:

  1. liên kết với localhost: 3306 (loopback) thay vì mặc định *: 3306 (tất cả các giao diện). Xong để tăng cường bảo mật.
  2. Thiết lập một vùng bảng cho mỗi bảng. Xong để tăng khả năng bảo trì.
  3. Đặt bộ ký tự mặc định thành UTF-8. Xong để cho phép quốc tế hóa dễ dàng theo mặc định.
  4. Đặt công cụ lưu trữ mặc định thành InnoDB. Đã hoàn tất để cho phép khóa cấp hàng theo mặc định.

Giả sử rằng bạn có thể cải thiện thêm thiết lập bằng cách thêm tối đa ba (3) tham số cấu hình. Bạn sẽ thêm cái gì và tại sao?

Cải tiến trong ngữ cảnh này có nghĩa là cải thiện hiệu suất, cải thiện độ tin cậy hoặc tăng dễ sử dụng/dễ bảo trì. Bạn có thể giả định rằng máy chạy MySQL instance sẽ có 1000 MB RAM.

+0

Ít nhất với MySQL 5.5, hãy xem xét thay đổi mặc định-character-set -> character_set_server – Touko

Trả lời

5

Để bộ nhớ cache dữ liệu hơn:

innodb_buffer_pool_size = 512M 

Nếu bạn viết rất nhiều dữ liệu:

innodb_log_file_size = 128M 

, để tránh quá nhiều chuyển đổi đăng nhập.

Không có thứ ba tôi muốn thêm vào trong mọi trường hợp, tất cả đều phụ thuộc.

0

Tăng InnoDB đệm kích thước hồ bơi, lớn như bạn thực tế có thể làm cho nó:

innodb_buffer_pool_size=768M 

Bạn cũng sẽ muốn có một số không gian đệm quan trọng cho các bảng tạm thời:

key_buffer_size=32M 

Những người khác sẽ phụ thuộc về những gì bạn đang làm với cơ sở dữ liệu, nhưng table_cache hoặc query_cache_size sẽ là một vài tiềm năng khác.

+0

Không phải là 'key_buffer_size' có liên quan cho' MyISAM' chỉ? – Quassnoi

+0

@Quassnoi - nó là, nhưng tôi nghĩ rằng MySQL sẽ luôn luôn sử dụng MyISAM cho bảng tạm thời, vì vậy bạn vẫn cần một số không gian đệm chính cho điều đó (ít nhất đây là những gì tôi nghe). Mặc dù vậy, tôi có thể sai về điều đó. –

1

Phân bổ nhiều bộ nhớ hơn 8M mặc định cho InnoDB (sử dụng innodb_buffer_pool_size) chắc chắn là một tính năng nâng cao. Về giá trị, trên một máy chủ cơ sở dữ liệu chuyên dụng như của bạn, bạn có thể thiết lập nó lên đến 80% RAM của bạn và bạn càng đặt giá trị này càng cao thì càng ít tương tác với đĩa cứng. Chỉ cần để cho hai xu của tôi, tôi muốn đề cập rằng bạn có thể có một số tăng hiệu suất tinh chỉnh giá trị của innodb_flush_log_at_trx_commit, tuy nhiên hy sinh tuân thủ ACID ... Theo MySQL manual:

Nếu giá trị của innodb_flush_log_at_trx_commit là 0, bộ đệm nhật ký được ghi ra tệp nhật ký một lần mỗi giây và tuôn ra để hoạt động đĩa được thực hiện trên tệp nhật ký , nhưng không có gì được thực hiện tại cam kết giao dịch .

Vì vậy, bạn có thể mất một số dữ liệu không được ghi chính xác trong cơ sở dữ liệu do sự cố hoặc bất kỳ sự cố nào. Một lần nữa theo hướng dẫn MySQL:

Tuy nhiên, khôi phục treo InnoDB là không bị ảnh hưởng và do đó phục hồi sụp đổ không làm việc không phụ thuộc vào giá trị.

Vì vậy, tôi xin đề nghị:

innodb_flush_log_at_trx_commit = 0 

Cuối cùng nếu bạn có một kết nối tốc độ cao (ví dụ: nếu bạn cần phải cấu hình MySQL để hỗ trợ một ứng dụng web mà truy cập vào cơ sở dữ liệu) thì bạn nên xem xét tăng số lượng kết nối tối đa cho một cái gì đó như 500. Nhưng vì đây là một cái gì đó nhiều hơn hoặc ít tầm thường và nổi tiếng, vì vậy tôi muốn nhấn mạnh về tầm quan trọng của back_log để đảm bảo kết nối.

Tôi hy vọng những thông tin này sẽ giúp bạn tối ưu hóa máy chủ cơ sở dữ liệu của mình.