Drupal数据库innodb或MyISAM?


10

我有一个Drupal网站,并且遇到性能问题。我发现了如何将数据库从MyISAM转换为InnoDB?表示通过切换可以提高性能。

如何确定我的MySQL数据库是InnoDB还是MyISAM?


1
表类型与目录无关。您可以在目录中混合使用MyISAM和InnoDB表。
mpdonadio

2
尽管在该级别进行优化有很多好处,但我高度怀疑更改表类型是否可以解决您的性能问题。差别不大。
Letharion 2012年

1
@克里斯·J·李,那是正确的。出于性能原因,可以使用混合表类型,或者利用仅适用于特定表类型的功能(例如,使用MyISAM表进行FULLTEXT搜索)。如果您更改mysqld的默认值并在目录中创建更多表,它也可能会偶然发生:)
mpdonadio

2
Letharion:那是完全错误的。表类型和为它们配置mysql的方式会对性能产生巨大影响!
Walter Heck 2012年

2
@Letharion:实际上,撇开体系结构的改进,在混合使用SELECT和UPDATE并发的情况下,性能会大大提高— UPDATE将在MyISAM中锁定一个表,但在InnoDB中仅锁定一行—意味着可以大幅提高性能只不过是改变表的引擎而已。现在,如果您执行的是愚蠢的查询,那么您正在执行的是愚蠢的查询,更改表类型将无济于事。但是,一发不可收拾地更换引擎也是不正确的。
BMDan

Answers:


8

您可以运行自定义查询:

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/


旧的MySQL Administrator工具也可以很好地用于此类情况。如果您在MySQL网站上闲逛,您仍然可以找到安装程序。
mpdonadio

@MPD哇,还在吗?即使是有点怀旧也必须下载它:)
Clive

管理员和查询浏览器现在已正式弃用,并且不受支持,但是您仍然可以下载它们。我讨厌Workbench,仍然使用它们。
mpdonadio

要在命令行上查看类似于phpMyAdmin中看到的输出,请使用SHOW TABLE STATUS。为了简单地计算每种引擎类型中有多少张表,它是SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE
BMDan

6

我最好的经验是在每个表的基础上进行决策。InnoDB很不错,因为它可以避免表锁定(一个进程写入时,其他任何进程都不能从表中读取数据),但是它使用COUNT()的性能却很差,而COUNT()通常用于分页器查询。

(编辑:请参阅下面的Clives评论)

这取决于您使用的数据库,对您的MySQL设置也有影响。如果您有权访问服务器,则第一步是mysqltuner,以检查配置:

https://github.com/rackerhacker/MySQLTuner-perl#readme


2
+1我不知道InnoDB 对于MySQL的COUNT查询速度很慢,尽管它实际上只影响包含带子句的查询,但是据MySQL的前高性能组经理所说,InnoDB的查询速度很慢。COUNT(*) WHERE
克莱夫(Clive)

3
原因是MyISAM为表中的行数维护每个表的值,这意味着简单表SELECT COUNT(*) FROM table可以立即使用该值返回。InnoDB不会,因此它必须扫描整个主键索引。就是说,尽管Drupal做了很多事情SELECT COUNT(*),但我只能想到整个代码中没有WHERE子句就可以做到这一点。因此,不要出于这个特殊的边缘情况而使用MyISAM。对于所有实际查询而言,具有适当大小的缓冲池的InnoDB将更快。
BMDan

6

只是尝试使网站更快,就像盲目地更换汽车一样,希望您下次能更快。

首先尝试低下的果实,如果这样做没有帮助,请尝试找出真正的瓶颈。

  1. 您是否打开了内置机制:页面缓存(仅对匿名用户有效),CSS和JS聚合?
  2. 如果主机提供像APC这样的操作码缓存,请打开它。
  3. 设置您的Drupal语言环境,包括完整的数据库。
  4. 确保已运行XDebug。
  5. 开始进行真实的性能分析。这样,您可以确定网站的哪些部分会占用大量时间。您的网站速度越慢,找到有罪代码/组件就越容易。

通常,这只是一个慢速的数据库查询,需要一个索引,或者是一个以慢速方式运行的模块。

我还发现了托管者之间的巨大差异。如果您开箱即用安装了新的Drupal,性能还可以吗?如果没有,是时候寻找其他托管人了。


5

FWIW我们将近2万个节点的Drupal 6.x站点遇到一些性能问题,我确实选择将所有表移至InnoDB。这很容易,我处理的方式是使用mysqldump将所有内容转储到sql文件,使用编辑器(sed)将所有MyISAM替换为InnoDB,然后从该文件重新加载数据库。缺点之一是您无法从InnoDB数据库(IIRC)恢复空间,但是只要将重复的表保存在单独的DB中,就不会有问题。哦,我们确实看到了显着的性能提升。而且由于我们有四个Drupal实例,因此从文件系统中消除了表文件的数量(是的,它们包含在InnoDB文件本身中)。这是我的价值$ .02。


2
拥有一个InnoDB表空间可以节省您的inode,但是(如您所言)会浪费磁盘空间。即使删除大量数据,也将无法回收该磁盘空间。这还会导致不必要的大备份文件,并且无法还原单个表。这就是为什么我更喜欢使用该innodb_file_per_table选项的原因。
geewiz

1
另外,您可以就地转换表:for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done。如果需要-uroot -psomepass,将适当的选项(例如,)添加到两个中mysql
BMDan

5

只是抬头。如果您在Drupal 6上,则可以安装DBTuner模块。它可以轻松地将您的表从MyISAM移至InnoDB。所以,是的,有一个模块!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.