Php Drupal数据库性能调优-将特定表从MyISAM切换到InnoDB
我有一个drupal站点,流量很低,但是有大量的新内容被自定义提要导入模块添加。此模块为导入的项目创建节点和关联的分类 目前,我相信我们所有的drupal表都是MyISAM。我正在考虑切换重写表:Php Drupal数据库性能调优-将特定表从MyISAM切换到InnoDB,php,mysql,performance,drupal,innodb,Php,Mysql,Performance,Drupal,Innodb,我有一个drupal站点,流量很低,但是有大量的新内容被自定义提要导入模块添加。此模块为导入的项目创建节点和关联的分类 目前,我相信我们所有的drupal表都是MyISAM。我正在考虑切换重写表: 节点 看门狗 会议 访问日志 你会考虑其他什么表格? 给InnoDB 你认为这是个好主意吗?我是否可能看到绩效提升?我之所以将此视为整体解决方案的一部分,是因为在导入时,mysqld经常会耗尽内存,导致整个系统停机。它只在导入时发生 我最终会看到这样的事情: xml import at [01/Jun
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和更多在这个盒子上运行。。。按原样征税。呵呵
因此,如果您对db的性能调整有任何意见,我将不胜感激,我现在正在进行研究
蒂亚
编辑:(我已经包括了我当前的my.cnf):
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
tmpdir=/var/lib/mysql/tmp
#旧密码=1
跳锁
键缓冲=2048M#从1024倍增加一倍
允许的最大数据包数=16M
表_缓存=5000
排序缓冲区大小=1M
读取缓冲区大小=1M
读取缓冲区大小=8M
myisam\排序\缓冲区\大小=64M
线程缓存大小=64#比32倍
线程并发性=8
查询缓存大小=1024M#比512倍
tmp_表_尺寸=1024M
最大堆表大小=1024M
反向对数=100
最大连接错误=10000
连接缓冲区大小=1M
打开文件=20000
交互超时=600
等待\u超时=600
ft\u min\u word\u len=3
ft_stopword_文件=“”
最大连接数=1000
#innodb_data_file_path=ibdata1:2000M;ibdata2:10M:自动扩展
#innodb日志文件大小=100M
#innodb_缓冲区_池_大小=384M
#innodb_附加_成员_池大小=20M
#日志慢速查询=/var/lib/mysqllogs/slow log
#长查询时间=2
#不使用索引的日志查询
#log bin=/var/lib/mysqllogs/bin log
#日志从属更新
#过期天数=14天
服务器id=1
[mysql.server]
user=mysql
#basedir=/var/lib
[mysqld_safe]
err log=/var/log/mysqld.log
pid文件=/var/run/mysqld/mysqld.pid
打开\u文件\u限制=65536
一般来说,InnoDB比MyISAM慢,因为InnoDB是原子的,而MyISAM不是。通过权衡性能,您可以获得数据可靠性 如果可以,在导入之前禁用索引,您将看到性能提高。一次重建所有索引比每次插入都更有效
您不希望将mysql配置为超出可用内存。内存设置分布在多个设置中。您可以使用类似的方法来确定mysql安装的优化程度。一般来说,InnoDB比MyISAM慢,因为InnoDB是原子的,而MyISAM不是。通过权衡性能,您可以获得数据可靠性 如果可以,在导入之前禁用索引,您将看到性能提高。一次重建所有索引比每次插入都更有效 您不希望将mysql配置为超出可用内存。内存设置分布在多个设置中。您可以使用类似的方法来确定mysql安装的优化程度。 但是,如果这种模式改变了,你的流量又增加了 原因#1:InnoDB执行行级锁定。对于MyISAM,执行任何INSERT、UPDATE或DELETE查询都将导致完全表锁定。即使在低流量的网站中,也可能存在两个或多个DB连接锁定同一个表的情况。有了InnoDB,这种可能性就完全消除了 原因2: 键缓存(大小由键缓冲区大小决定)保存MyISAM表的索引页。总是有磁盘I/O从MyISAM读取数据。第一次读取的记录将缓存用于在键缓存中查找行的索引页。后续的查找将在密钥缓存中找到所需的密钥,但始终需要强制磁盘I/O来获取数据。对于InnoDB,数据页和索引页都位于InnoDB缓冲池中(大小由InnoDB_Buffer_Pool_size决定)。所有缓存在缓冲池中的内容都大大减少了磁盘I/O 我一直建议Drupal数据库使用InnoDB而不是MyISAM 在此之前,MyISAM是您所需要的全部火力。 但是,如果这种模式改变了,你的流量又增加了 原因#1:InnoDB执行行级锁定。对于MyISAM,执行任何INSERT、UPDATE或DELETE查询都将导致完全表锁定。即使在低流量的网站中,也可能存在两个或多个DB连接锁定同一个表的情况。有了InnoDB,这种可能性就完全消除了 原因2: 键缓存(大小由键缓冲区大小决定)保存MyISAM表的索引页。总是有磁盘I/O从MyISAM读取数据。第一次读取的记录将缓存用于在键缓存中查找行的索引页。后续的查找将在密钥缓存中找到所需的密钥,但始终需要强制磁盘I/O来获取数据。对于InnoDB,数据页和索引页都位于InnoDB缓冲池中(大小由InnoDB_Buffer_Pool_size决定)。所有缓存在缓冲池中的内容都大大减少了磁盘I/O 我一直建议Drupal数据库使用InnoDB而不是MyISAM
在那之前,MyISAM是你所需要的全部火力,。这种笼统的说法是不正确的。经过正确调整,InnoDB可以在具有许多写操作的表上表现得更好,例如,由于行级锁定。这也是我的理解,这就是为什么我建议在重写表上使用InnoDB的原因。我将签出mysqltu [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