我的伺服器的最佳 MySQL 配置
我是配置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 執行得更快。
我之前寫過關於這個的文章:
Jun 19, 2011
:如何正確執行 MySQL 烘烤?Oct 05, 2011
:查詢在一些較新的 MySQL 版本中執行時間較長Nov 24, 2011
:為什麼 mysql 5.5 比 5.1 慢 (linux,using mysqlslap)Jun 16, 2012
:從 mysql 伺服器 5.0 遷移到 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
請參閱我關於這些設置的其他文章
May 26, 2011
:關於單執行緒與多執行緒數據庫的性能Sep 12, 2011
:可以讓 MySQL 使用多個核心嗎?Sep 20, 2011
:多核和 MySQL 性能Apr 26, 2012
: CPU 性能與數據庫伺服器有關嗎?順便說一句,您的日誌緩衝區有點太大了。我將它降低到 32M,因為雖然更大的日誌緩衝區可以節省磁碟 I/O,但它會導致更長的 COMMIT。
我還注意到您在 ibdata1 中擁有所有 InnoDB,因為 innodb_file_per_table 已禁用。無論如何嘗試上述設置。如果您想將數據和索引從 ibdata1 移出並移到它們自己的表空間文件中,請參閱我過去關於為 ibdata1 之外的數據和索引儲存清理 InnoDB 的文章:
May 21, 2012
: MySQL 數據庫相對於轉儲文件有多大?Apr 01, 2012
: innodb_file_per_table 可取嗎?Mar 25, 2012
:為什麼 InnoDB 將所有數據庫儲存在一個文件中?Feb 04, 2011
: MySQL InnoDB - innodb_file_per_table 缺點?Oct 29, 2010
: Howto: 清理 mysql InnoDB 儲存引擎?這將控制 ibdata1 的過度增長並允許您壓縮數據和索引。
快速開車建議…
innodb_flush_method=O_DIRECT 只能用於具有自己的寫入記憶體的儲存設備(例如,電池支持的 RAID 卡或 SAN)。在看起來像您擁有的普通硬碟驅動器上,讓作業系統進行緩衝。
您可能還想驗證您尚未填滿記憶體並開始交換。如果是這樣,您可能希望降低 innodb_buffer_pool_size。我的目標是讓作業系統至少有 25% 的可用記憶體用於記憶體。