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


Drupal database performance tuning - switching particular tables to InnoDB from MyISAM

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

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

  1. 节点
  2. 看门狗
  3. 会话
  4. 访问日志
  5. 你还会考虑其他哪些桌子

至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]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socktmpdir=/var/lib/mysql/tmp#旧密码=1跳跃锁定key_buffer=2048M#从1024加倍最大允许数据包=16Mtable_cache=5000sort_buffer_size=1Mread_buffer_size=1Mread_rnd_buffer_size=8Mmyisam_sort_buffer_size=64Mthread_cache_size=64#从32加倍thread_concurrency=8query_cache_size=1024M#从512增加一倍tmp_table_size=1024M最大heap_table_size=1024Mback_log=100最大连接错误=10000join_buffer_size=1M打开的文件=20000interactive_timeout=600wait_timeout=600ft_min_word_len=3ft_stopword_file=''最大连接数=1000#innodb_data_file_path=ibdata1:2000M;ibdata2:10M:自动扩展#innodb_log_file_size=100M#innodb_buffer_pool_size=384M#innodb_additional_mem_pool_size=20M#日志慢速查询=/var/lib/mysqllogs/slow-log#long_query_time=2#不使用索引的日志查询#log bin=/var/lib/mysqllogs/bin log#日志从属更新#expire_logs_days=14服务器id=1[mysql.server]user=mysql#basedir=/var/lib[mysqld_safe]错误日志=/var/log/mysqld.logpid文件=/var/run/mysqld/mysqld.pidopen_files_limit=65536

如果您确信该网站的流量会很低,请务必保留在MyISAM中

然而,如果这种模式发生变化,并且您再次成为高流量,您可以将所有内容配置到InnoDB中,原因有两个:

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

REASON#2:InnoDB缓存数据和索引。MyISAM仅缓存索引页。

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

我一直建议Drupal数据库使用InnoDB而不是MyISAM。实际上,使用直接MySQL进行转换很容易。

在此之前,MyISAM是您所需要的所有火力,尤其是在RAM适中的服务器上。

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

如果可以,在导入之前禁用索引,您将看到性能提升。一次重新生成索引比每次插入更有效。

您不希望将mysql配置为超过可用内存。内存设置分布在多个设置中。你可以用这样的东西http://mysqltuner.pl/mysqltuner.pl以确定mysql安装的调优情况。