优化后mySQL运行速度慢了5倍?

时间:2012-08-03 18:11:12

标签: mysql

我有一台Xeon 2.0Ghz服务器(12个内核),内存为16GB,运行Apache和mySQL,用于InnoDB(Percona)的大约50,000条记录的网站。我的查询过去大约在0.17到0.25秒之间返回,然后我运行了Percona工具mySQL优化器,上传了新的my.cnf文件,突然相同的查询需要1.20到1.30秒,所以大约要长5倍。

我做错了什么?这是我的新旧my.cnf文件“

NEW:

[mysqld]
default_storage_engine         = InnoDB

key_buffer_size                = 32M
myisam_recover                 = FORCE,BACKUP

max_allowed_packet             = 16M
max_connect_errors             = 1000000

log_bin                        = /var/lib/mysql/mysql-bin
expire_logs_days               = 14
sync_binlog                    = 1

tmp_table_size                 = 32M
max_heap_table_size            = 32M
query_cache_type               = 0
query_cache_size               = 0
max_connections                = 200
thread_cache_size              = 50
open_files_limit               = 65535
table_definition_cache         = 1024
table_open_cache               = 2048

innodb_flush_method            = O_DIRECT
innodb_log_files_in_group      = 2
innodb_log_file_size           = 256M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table          = 1
innodb_buffer_pool_size        = 12G

log_error                      = /var/lib/mysql/mysql-error.log
log_queries_not_using_indexes  = 1
slow_query_log                 = 1
slow_query_log_file            = /var/lib/mysql/mysql-slow.log

OLD:

[mysqld]
innodb_buffer_pool_size = 12000M
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 16M
innodb_additional_mem_pool_size = 20M
innodb_thread_concurrency = 20

read_rnd_buffer_size=50M
query_cache_size=128M
query_cache_type=1
tmp_table_size=512M
wait_timeout=90
query_cache_limit=64M
key_buffer_size=128M
max_heap_table_size=512M
max_allowed_packet=32M
log_slow_queries
log-queries-not-using-indexes
long_query_time  = 1 

1 个答案:

答案 0 :(得分:0)

在跑步一段时间后,你是否正在交换?

您可能会尝试拒绝innodb_buffer_pool_size,因为您说服务器也在运行Apache。目前看起来MySQL有可能为自己耗尽所有服务器的内存,并且不为操作系统和Apache留下任何东西。

尝试将innodb_buffer_pool_size设为8G,然后将innodb_log_file_size设为2G

你也可以提升你的innodb_thread_concurrency,但由于它不是一个专用的MySQL服务器,它的默认值为8可能没问题。这取决于你拥有的CPU,但文档说:

  

此变量的正确值取决于环境和   工作量。您需要尝试一系列不同的值   确定适用于您的应用程序的值。推荐值   是CPU数量加上磁盘数量的2倍。

因此,尽量利用它,看看哪种方法效果最佳。

此外,您的数据库是否大于您拥有的RAM数量,或者您的整个数据库是否适合内存?

请记住,由于您在同一台服务器上运行Apache,因此Apache需要创建一堆自己的线程,并根据所有服务器进程的需要消耗尽可能多的内存,如果您正在运行某些内容就像PHP那样也会占用内存。

你必须找到一个很好的平衡,Apache和MySQL都可以在同一系统上以最大容量运行,但是没有人使用那么多内存而另一个必须交换。

您可以排除故障或分析性能的其他方法是检查慢查询日志并运行慢查询的解释。此外,您可以安装Percona工具包并运行pt-query-digest来分析您的性能。阅读文档here