如何在具有16 GB RAM的QuadCore机器上充分利用MySQL?


10

我正在工作站上运行MySQL 5.5服务器以进行科学数据分析,并想知道如何配置MySQL以便从性能方面获得最大收益。我通常运行的查询类型涉及10-20个表的联接,并且可以运行很长时间,一到几分钟也不例外。只有极少数用户同时访问数据库(最多5个用户)。我将服务器从具有2.2 GHz双核和4 GB RAM的Lenovo Thinkpad T61移到了以下具有手动选择组件的全新机器上:

  • Intel i7 3770,4x 3.4 GHz(以4x3.7 GHz运行)
  • Z77芯片组
  • 16 GB DDR3 1600 RAM
  • Windows 7 Prof 64位
  • Windows和MySQL服务器在Intel 520系列SSD驱动器上运行。

首次测试(在两台计算机上运行相同的查询)显示了新测试的速度有了明显的提高,但是查询仍然需要很多时间,我期望会有更多的提升。所讨论的查询已得到很好的优化,即所有表都具有适当的键,这些键也从“解释扩展”开始使用。

现在回到我当前的MySQL设置:首先,我应该提到很久以前我从MyISAM迁移到Innodb。

我的my.ini进行了一些调整(即偏离默认设置):

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system.  Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M

general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries

我想知道是否有人会建议更改上述数字或什至我不知道的其他设置。

我将不胜感激。

史蒂夫

编辑:我有两个查询涉及10-20表之间的联接,并在我的联想笔记本电脑和新PC上运行它们。查询#1在新计算机上花费了3m36s,在笔记本电脑上花费了9m11s。查询2在工作站上花费了22.5s,在笔记本电脑上花费了48.5s。因此执行速度大约提高了2-2.5倍。在工作站上,甚至没有使用50%的RAM。四个内核的平均CPU负载(如Windows任务管理器所报告)仅约为13%。每个内核的负载(如Core Temp所报告)对于一个内核大约为25-40%,而对于其他内核则小于等于10%,这表明MySQL在单个查询中没有使用多个内核。


请出示你的服务器的负载,所以检查内存,IO,CPU负载等

我将运行一些测试,并报告Windows任务管理器必须说的内容(或者您会建议使用更好的工具?)

这足以让您首先了解问题所在。

刚刚添加了一些统计信息。

2
此外,您也可以尝试在Percona的向导,以获得“推荐”为数据库服务器设置在tools.percona.com/wizard
斯蒂芬Senkomago穆索凯

Answers:


5

由于运行的是MySQL 5.5,因此您可能需要考虑配置InnoDB来访问多个内核

这是您应该使用的设置

innodb_thread_concurrency设置InnoDB可以保持打开状态的并发线程数的上限。为此设置的最佳轮数是(2 X CPU数量)+磁盘数量。更新:正如我从Percona NYC大会上第一手了解到的那样,您应该将其设置为0,以提醒InnoDB Storage Engine为正在运行的环境找到最佳线程数。

innodb_concurrency_tickets设置可以绕过并发检查而不受惩罚的线程数。达到该限制后,线程并发检查再次成为常态。

innodb_commit_concurrency设置可以提交的并发事务数。由于默认值为0,因此未设置此选项将允许任意数量的事务同时提交。

innodb_thread_sleep_delay设置在重新输入InnoDB队列之前InnoDB线程可以处于休眠状态的毫秒数。默认值为10000(10秒)。

innodb_read_io_threadsinnodb_write_io_threads(均自MySQL 5.1.38起)为读取和写入分配指定数量的线程。默认值为4,最大值为64。

innodb_replication_delay在达到innodb_thread_concurrency时在从属服务器上施加线程延迟。

这是我过去关于MySQL 5.5和为InnoDB激活多个内核的文章



1

内存使用情况:请参见http://mysql.rjweb.org/doc.php/memory (大多数可调参数不会产生太大的影响。)

max_heap_table_size = 4000M太高了!如果有4位用户需要,则您的RAM不足,无法进行交换。交换对性能的伤害远不止于此。

查询需要花费几秒钟的时间:应该对其进行研究以进行改进;请提供SHOW CREATE TABLE;显示表格状态;解释选择


0

您也可以考虑使用otger选项。如FreeBSD上的PostgreSQL。但是从Windows过渡到Linux会提高性能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.