我是 mysql 新手。在创建项目时,我没有注意表类型和排序规则类型。现在,我已经有 20 个表,其中 15 个表是 MyISAM 类型,其余的是 innoDB 类型。我注意到我的应用程序变得非常慢。是因为表类型吗?
更多信息:
15 个表的排序规则是 utf_unicode_ci,其他 5 个是 latin1_swedish_ci。(我不确定为什么它们不同)这会影响性能吗?
我的应用程序位于 Flash > php > MySQL 中。
现在登录、加载高分和保存高分非常非常慢!!
答案1
MyISAM 和 InnoDB 之间的基本区别在于后者可以使用事务对数据库进行原子更改。MyISAM 通常对于较简单的表来说速度更快,但这不应该是您的设置的问题。您是否在表上创建了正确的索引以加快更新速度?
答案2
如果直接进入 MYSQL DB 并运行查询,速度会很慢吗?(无论是从命令行 mysql 工具还是使用 SQLYog 等 GUI)如果只是使用 PHP->MySQL,速度会很慢吗?
当数据库正常且性能瓶颈在其他地方时,我们可能正在尝试解决 MySQL 问题;从您的描述来看,查询非常基本,即使没有优化也应该很快。
答案3
每种数据库类型都有各自的优缺点。InnoDB 的“吹嘘”之处在于它支持行锁定,而 MyIsam 则支持整个表锁定。这对您来说意味着什么?如果您有一个经常读取和更改的表,并且 SQL 语句使用“锁定”命令,那么 InnoDB 会稍微快一些。因为它只需要锁定正在操作的行,而不是整个表。
除此之外,两者之间确实没有太大区别。这取决于出色的 d/b 规划,确保您的表格是索引,并确保它们经过优化。
[编辑 2009-11-11]
在对问题进行进一步思考之后,我想知道问题是否真的出在代码中。数据库很少是问题的根源。从 gui/cli 运行一些测试查询,看看您的程序执行的平均查询需要多长时间。如果数字大于半秒(.05),则有一些优化空间。如果少于半秒,则您的数据库完全没问题。
优化后,再次检查查询时间。现在它们可能更小了。我敢打赌错误出在代码中。
答案4
表格类型使得巨大的确定数据库如何执行的差异,特别是在大量行的高负载下。
例如,MyISAM 通常比 InnoDB 更快,但是,MyISAM 在执行更新或删除操作时必须锁定整个表,或者在执行未附加到文件的插入操作时必须锁定整个表,从而阻止所有其他操作(包括选择),直到操作完成为止。InnoDB 不执行表级锁定,因此它可以更有效地处理这种情况。
InnoDB 和 MyISAM 实现索引的方式也不同,因此,使表对于其中一种类型更高效的索引可能会使其在使用另一种表类型时运行得更慢。
这里要列出的差异太多了,而且大多数差异需要花些时间来解释,但我建议你仔细阅读相关章节高性能 MySQL了解更多信息。