Drupal 数据库性能调优——将特定表从 MyISAM 切换到 InnoDB

Posted

技术标签:

【中文标题】Drupal 数据库性能调优——将特定表从 MyISAM 切换到 InnoDB【英文标题】:Drupal database performance tuning - switching particular tables to InnoDB from MyISAM 【发布时间】:2011-09-14 22:14:03 【问题描述】:

我有一个流量较低的 drupal 网站,但有大量新内容正在通过自定义提要导入器模块添加。该模块为导入的文章创建节点和关联的分类法。

目前,我相信我们所有的 drupal 表都是 MyISAM。我正在考虑切换繁重的写表:

    节点 看门狗 会话 访问日志 您还会考虑哪些其他表?

到 InnoDB。

你认为这是个好主意吗?我可能会看到性能提升吗?我将其视为整体解决方案的一部分的原因是,在导入时,mysqld 经常耗尽内存并导致整个系统停机。它只发生在导入时。

我最终会看到这样的事情:

xml import at [01/Jun/2011:13:26:38 -0400] "GET /import/xml_import HTTP/1.1" 200
....
14:02:38 [ERROR] /usr/libexec/mysqld: Out of memory (Needed 1049152 bytes)

这个盒子是 x32 的,所以我们受限于我们可以分配给 mySql 的内存量。我们还在这个盒子上运行 php、JAVA、SVN 等……它按原样征税。呵呵。

因此,一般而言,任何关于性能调整数据库的意见都将不胜感激,我现在​​正在研究。

TIA。

编辑:(我已经包含了我当前的 my.cnf):

[mysqld] 数据目录=/var/lib/mysql socket=/var/lib/mysql/mysql.sock tmpdir=/var/lib/mysql/tmp #old_passwords=1 跳跃锁定 key_buffer = 2048M #从 1024 翻倍 max_allowed_pa​​cket = 16M 表缓存 = 5000 排序缓冲区大小 = 1M 读取缓冲区大小 = 1M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 64M thread_cache_size = 64 #从 32 翻倍 线程并发 = 8 query_cache_size = 1024M #从 512 翻倍 tmp_table_size=1024M max_heap_table_size=1024M back_log = 100 max_connect_errors = 10000 join_buffer_size=1M 打开文件 = 20000 交互超时 = 600 等待超时 = 600 ft_min_word_len=3 ft_stopword_file='' 最大连接数=1000 #innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend #innodb_log_file_size = 100M #innodb_buffer_pool_size = 384M #innodb_additional_mem_pool_size = 20M #log-slow-queries=/var/lib/mysqllogs/slow-log #long_query_time=2 #log-queries-not-using-indexes #log-bin=/var/lib/mysqllogs/bin-log #log-slave-updates #expire_logs_days = 14 服务器 ID = 1 [mysql.server] 用户=mysql #basedir=/var/lib [mysqld_safe] 错误日志=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid open_files_limit=65536

【问题讨论】:

作为替代方案,您可以将监视程序消息记录到不同的位置,例如 syslog(只需启用 syslog.module 而不是 dblog.module)或 mongodb (drupal.org/project/mongodb)。此外,尝试确定哪些查询实际上很慢。在另一个类似的问题中,它原来是来自通知模块的表上的单个缺失索引,这极大地减慢了整个导入:drupal.stackexchange.com/questions/3021/… 【参考方案1】:

If you know for a certainty that the website will be low trafficked, by all means remain in MyISAM.

然而,如果这种模式改变了,你又会变成高流量,you could configure everything into InnoDB for two major reasons

原因 #1:InnoDB 执行行级锁定。对于 MyISAM,任何执行的 INSERT、UPDATE 或 DELETE 查询都会导致全表锁定。即使在低流量网站中,也可能存在两个或多个数据库连接锁定同一个表。有了 InnoDB,这种可能性就完全消除了。

原因 #2:InnoDB Caches Data and Indexes. MyISAM only caches Index Pages.

键缓存(大小由 key_buffer_size 决定)保存 MyISAM 表的索引页。总是有磁盘 I/O 来从 MyISAM 读取数据。第一次读取的记录会将用于查找行的索引页缓存到键缓存中。随后的查找将在密钥缓存中找到所需的密钥,但总会有强制性的磁盘 I/O 来获取数据。对于 InnoDB,数据和索引页面都驻留在 InnoDB 缓冲池中(大小为 innodb_buffer_pool_size)。缓存在缓冲池中的所有内容都大大减少了磁盘 I/O。

我一直推荐使用 InnoDB 而不是 MyISAM 的 Drupal 数据库。 It is actually easy to convert using straight MySQL.

在此之前,MyISAM 是您所需要的全部火力,especially on servers with modest RAM。

【讨论】:

【参考方案2】:

一般来说,InnoDB 比 MyISAM 慢,因为 InnoDB 是原子的,而 MyISAM 不是。通过权衡性能,您可以获得数据可靠性。

如果可以,请在导入前禁用索引,您将看到性能提升。一次重建所有索引而不是每次插入都更有效。

您不想将 mysql 配置为超出可用内存。内存设置分布在多个设置中。您可以使用类似 http://mysqltuner.pl/mysqltuner.pl 的内容来确定您的 mysql 安装的调整情况。

【讨论】:

一般性陈述是不正确的。 InnoDB 可以正确调整,在具有许多写入的表上执行得更好,例如,由于行级锁定。 这也是我的理解,这就是我建议在重写入表上使用 InnoDB 的原因。我现在将检查 mysqltuner 脚本,谢谢。 行级锁定将有助于在多个连接争用同一个表的情况下。如果它是一个单线程的导入过程,它不会有太大的不同。 啊好吧,有趣的一点。也许我会暂时离开桌子并调整 my.cnf。

以上是关于Drupal 数据库性能调优——将特定表从 MyISAM 切换到 InnoDB的主要内容,如果未能解决你的问题,请参考以下文章

libreoffice 将所有/特定工作表从 excel 转换为 csv

SQL调优简介及调优方式

AutoML 助力 AI 性能调优

优化技术专题「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)

分布式技术专题「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)

Drupal Group 模块,以编程方式将用户添加到具有特定角色的组