[英]Drupal database performance tuning - switching particular tables to InnoDB from MyISAM
我有一个 drupal 网站,它的流量很低,但自定义提要导入器模块添加了大量新内容。 该模块为导入的文章创建节点和关联的分类法。
目前,我相信我们所有的 drupal 表都是 MyISAM。 我正在考虑切换繁重的写表:
到 InnoDB。
你认为这是个好主意吗? 我可能会看到性能提升吗? 我将其视为整体解决方案的一部分的原因是,在导入时,mysqld 经常用完 memory 并使整个系统停机。 它仅在导入时发生。
我最终会看到这样的事情:
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,所以我们仅限于 memory 的数量,我们可以分配给 mySql。 我们还有 PHP、JAVA、SVN 和更多运行在这个盒子上......它按原样征税。 呵呵。
因此,一般来说,任何关于性能调整数据库的输入都会受到赞赏,我现在正在做研究。
TIA。
编辑:(我已经包含了我当前的 my.cnf):
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock tmpdir=/var/lib/mysql/tmp #old_passwords=1 skip-locking key_buffer = 2048M #doubled from 1024 max_allowed_packet = 16M table_cache = 5000 sort_buffer_size = 1M read_buffer_size = 1M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 64M thread_cache_size = 64 #doubled from 32 thread_concurrency = 8 query_cache_size = 1024M #doubled from 512 tmp_table_size=1024M max_heap_table_size=1024M back_log = 100 max_connect_errors = 10000 join_buffer_size=1M open-files = 20000 interactive_timeout = 600 wait_timeout = 600 ft_min_word_len=3 ft_stopword_file='' max_connections=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 server-id = 1 [mysql.server] user=mysql #basedir=/var/lib [mysqld_safe] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid open_files_limit=65536
如果您确定该网站的访问量较低,请务必保留在 MyISAM 中。
但是,如果这种模式发生变化并且您再次成为高流量, 您可以将所有内容配置到 InnoDB 中,主要有两个原因
原因 #1 :InnoDB 执行行级锁定。 对于 MyISAM,任何执行的 INSERT、UPDATE 或 DELETE 查询都会导致全表锁定。 即使在低流量网站中,也可能存在两个或多个数据库连接锁定同一个表。 使用 InnoDB,完全消除了这种可能性。
原因 #2 : InnoDB 缓存数据和索引。 MyISAM 只缓存索引页。
键缓存(大小由 key_buffer_size 决定)保存 MyISAM 表的索引页。 总是有磁盘 I/O 来从 MyISAM 读取数据。 第一次读取的记录会将用于查找行的索引页缓存到键缓存中。 随后的查找将在密钥缓存中找到所需的密钥,但总会有强制性的磁盘 I/O 来获取数据。 对于 InnoDB,数据和索引页面都驻留在 InnoDB 缓冲池中(大小为 innodb_buffer_pool_size)。 缓冲池中缓存的所有内容都大大减少了磁盘 I/O。
我一直推荐使用 InnoDB 而不是 MyISAM 的 Drupal 数据库。 使用直接 MySQL 实际上很容易转换。
在那之前,MyISAM 是您所需要的全部火力, 尤其是在 RAM 适中的服务器上。
一般来说,InnoDB 比 MyISAM 慢,因为 InnoDB 是原子的,而 MyISAM 不是。 通过权衡性能,您可以获得数据可靠性。
如果可以,请在导入前禁用索引,您将看到性能提升。 一次重建所有索引而不是每次插入都更有效。
您不想将 mysql 配置为超过可用的 memory。 memory 设置分布在多个设置中。 您可以使用类似这样的 http://mysqltuner.pl/mysqltuner.pl来确定您的 mysql 安装的调整程度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.