我有一个Drupal网站,并且遇到性能问题。我发现了如何将数据库从MyISAM转换为InnoDB?表示通过切换可以提高性能。
如何确定我的MySQL数据库是InnoDB还是MyISAM?
我有一个Drupal网站,并且遇到性能问题。我发现了如何将数据库从MyISAM转换为InnoDB?表示通过切换可以提高性能。
如何确定我的MySQL数据库是InnoDB还是MyISAM?
Answers:
您可以运行自定义查询:
SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'
列出数据库中的所有表以及每个表所使用的引擎。
或者,您可以使用phpMyAdmin登录数据库并选择数据库...您将Type
在表列表的列中看到引擎。
我个人推荐Navicat for MySQL,这是一个非常不错的MySQL GUI,可以很容易地找到类似的东西。
资料来源:http : //www.electrictoolbox.com/mysql-table-storage-engine/
SHOW TABLE STATUS
。为了简单地计算每种引擎类型中有多少张表,它是SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE
。
我最好的经验是在每个表的基础上进行决策。InnoDB很不错,因为它可以避免表锁定(一个进程写入时,其他任何进程都不能从表中读取数据),但是它使用COUNT()的性能却很差,而COUNT()通常用于分页器查询。
(编辑:请参阅下面的Clives评论)
这取决于您使用的数据库,对您的MySQL设置也有影响。如果您有权访问服务器,则第一步是mysqltuner,以检查配置:
SELECT COUNT(*) FROM table
可以立即使用该值返回。InnoDB不会,因此它必须扫描整个主键索引。就是说,尽管Drupal做了很多事情SELECT COUNT(*)
,但我只能想到整个代码中没有WHERE
子句就可以做到这一点。因此,不要出于这个特殊的边缘情况而使用MyISAM。对于所有实际查询而言,具有适当大小的缓冲池的InnoDB将更快。
只是尝试使网站更快,就像盲目地更换汽车一样,希望您下次能更快。
首先尝试低下的果实,如果这样做没有帮助,请尝试找出真正的瓶颈。
通常,这只是一个慢速的数据库查询,需要一个索引,或者是一个以慢速方式运行的模块。
我还发现了托管者之间的巨大差异。如果您开箱即用安装了新的Drupal,性能还可以吗?如果没有,是时候寻找其他托管人了。
FWIW我们将近2万个节点的Drupal 6.x站点遇到一些性能问题,我确实选择将所有表移至InnoDB。这很容易,我处理的方式是使用mysqldump将所有内容转储到sql文件,使用编辑器(sed)将所有MyISAM替换为InnoDB,然后从该文件重新加载数据库。缺点之一是您无法从InnoDB数据库(IIRC)恢复空间,但是只要将重复的表保存在单独的DB中,就不会有问题。哦,我们确实看到了显着的性能提升。而且由于我们有四个Drupal实例,因此从文件系统中消除了表文件的数量(是的,它们包含在InnoDB文件本身中)。这是我的价值$ .02。
innodb_file_per_table
选项的原因。
for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done
。如果需要-uroot -psomepass
,将适当的选项(例如,)添加到两个中mysql
。
只是抬头。如果您在Drupal 6上,则可以安装DBTuner模块。它可以轻松地将您的表从MyISAM移至InnoDB。所以,是的,有一个模块!