【问题标题】:How can I speed up INNODB queries comparable to MYISAM performance?如何加快与 MISAM 性能相当的 INNODB 查询?
【发布时间】:2011-06-12 22:06:57
【问题描述】:

我最近将我的数据库表从 MYISAM 切换到 INNODB 并且遇到查询超时错误,主要是插入。我之前使用的一个函数在大约 30 个 MISAM 表中插入、删除和更新大量记录需要不到 2 秒的时间,但现在它们是 INNODB,该函数会导致 PHP 超时。

超时设置为 60 秒。我已经充分优化了我的脚本,即使仍然有很多查询,它们也会组合在一起(多次插入、多次删除等),脚本现在需要大约 25 秒,这比看起来有很大的增加至少 60 秒。

在之前使用 MISAM 时,这个持续时间仍然快了 10 倍以上,我在处理这些查询的方式上是否有任何错误?或者是否有任何设置可以帮助提高性能?目前 MySQL 使用默认安装设置。

查询没什么特别的,DELETE ... WHERE ... 简单的逻辑,与INSERTUPDATE 查询相同。

【问题讨论】:

  • 你能发布你的表定义吗?

标签: php mysql insert innodb myisam


【解决方案1】:

如果不了解您的环境就很难说,但这可能更像是一个数据库调整问题。 InnoDB 在预算硬件上可能非常慢,每次写入都会强制进行真正的刷新。 (这会影响写入,而不是读取。)

例如,您可能想阅读以下选项:

innodb_flush_log_at_trx_commit=2
sync_binlog=0

通过避免刷新,您可以显着加快应用程序的速度,但代价是服务器崩溃时可能会丢失数据。

如果您绝对无法忍受数据丢失,那么另一个选择是使用更好的硬件。

【讨论】:

    【解决方案2】:

    为每个查询运行explain。也就是说,如果慢查询是select foo from bar;,则运行explain select foo from bar;

    检查计划,并根据需要添加索引。重新运行解释,并确保正在使用索引。

    【讨论】:

    • 你从哪里得到的“计划”部分?
    • EXPLAIN PLAN FOR 是 Oracle 语法。使用 MySQL,您可以在查询前加上 EXPLAIN。
    • 是的,我的错,对不起。最近我做的 Oracle 比 MySQL 多。 :)
    【解决方案3】:

    Innodb 构建散列索引,通过传递 BTREE 索引和使用散列来帮助加快索引查找速度,这样更快

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 2015-05-23
    • 1970-01-01
    • 2023-02-09
    • 2011-08-20
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多