Ubuntu

我的伺服器的最佳 MySQL 配置

  • October 24, 2012

我是配置mysql的小新手,我需要一些建議。

幾天前,我在 Ubuntu Server 12.04 上使用 samba、mysql 5.5、apache 2.2、PHP 5.4.6 等製作了小型家庭伺服器。

我用它來為每個 samba 共享文件並在 PHP/MySQL 中託管我的本地項目 - 我是程序員,我經常測試新的解決方案等

它執行良好,但 InnoDB 表上的 INSERTS 速度非常慢。

我認為這是 my.cnf 中的錯誤配置,因為幾個月前我在 Windows WAMP 上使用同一台電腦並且查詢速度更快……

一些資訊:

  • CPU: Intel(R) Pentium(R) 4 CPU 3.00GHz
  • 記憶體:1GB
  • 硬碟:邁拓6L200M0(189GiB(203GB))

實際my.cnf:

[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
query_cache_limit   = 1M
query_cache_size        = 32M
innodb_buffer_pool_size=512M
innodb_additional_mem_pool_size=10M
innodb_flush_method=O_DIRECT
innodb_log_buffer_size=80M
expire_logs_days    = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[mysql]
no-auto-rehash

[isamchk]
key_buffer=32M
sort_buffer=32M
read_buffer=16M
write_buffer=16M

[mysqlhotcopy]
interactive-timeout

[myisamchk]
key_buffer=32M
sort_buffer=32M
read_buffer=16M
write_buffer=16M

您可能會發現這令人驚訝,但 MySQL 5.5 可以配置為訪問 InnoDB 的多個核心。預設情況下不啟用這些功能。事實上,在某些情況下,舊版本的 MySQL “開箱即用”比 MySQL 5.5 執行得更快。

我之前寫過關於這個的文章:

您必須設置一些選項來喚醒 InnoDB 的多個核心功能

[mysqld]
innodb_io_capacity=2000
innodb_read_io_threads=32
innodb_write_io_threads=32
innodb_log_buffer_size=32M
innodb_thread_concurrency=0

請參閱我關於這些設置的其他文章

順便說一句,您的日誌緩衝區有點太大了。我將它降低到 32M,因為雖然更大的日誌緩衝區可以節省磁碟 I/O,但它會導致更長的 COMMIT。

我還注意到您在 ibdata1 中擁有所有 InnoDB,因為 innodb_file_per_table 已禁用。無論如何嘗試上述設置。如果您想將數據和索引從 ibdata1 移出並移到它們自己的表空間文件中,請參閱我過去關於為 ibdata1 之外的數據和索引儲存清理 InnoDB 的文章:

這將控制 ibdata1 的過度增長並允許您壓縮數據和索引。

快速開車建議…

innodb_flush_method=O_DIRECT 只能用於具有自己的寫入記憶體的儲存設備(例如,電池支持的 RAID 卡或 SAN)。在看起來像您擁有的普通硬碟驅動器上,讓作業系統進行緩衝。

您可能還想驗證您尚未填滿記憶體並開始交換。如果是這樣,您可能希望降低 innodb_buffer_pool_size。我的目標是讓作業系統至少有 25% 的可用記憶體用於記憶體。

引用自:https://dba.stackexchange.com/questions/27473