【问题标题】:Why my mysql table has to optimize frequently为什么我的mysql表要经常优化
【发布时间】:2013-12-11 16:54:50
【问题描述】:

我有一个 mysql 表,有 12 列,一个主键和两个唯一键。我在这个表中有或多或少的 86000 行/记录。 我使用这个mysql代码:

INSERT INTO table (col2,col3,-------col12) VALUES ($val2,$val3,----------$val12) ON DUPLICATE KEY UPDATE col2=VALUES($val2), col3=VALUES($val3),----------------col12=VALUES($val12)

当我从 cpanel phpmyadmin 查看该表的结构时,我可以在该表的索引信息下方看到“优化表”链接。如果我单击该链接,则表已优化。

但我的问题是为什么我在此表中如此频繁地看到“优化表”链接(在 3/4 天内出现),而该数据库的其他表没有显示优化表链接(它们显示每月链接一次,甚至每两个月或更长时间链接一次)。

由于我不是删除这个表行,只是插入,如果发现重复键,只是更新,那么为什么需要如此频繁地优化?

【问题讨论】:

  • 你启用了 innodb_file_per_table 吗?
  • 您是否更新了唯一键中的列?
  • 不,它不是innodb结构化表,它的引擎是MyISAM
  • 不,唯一键列不会在查询中更新。

标签: mysql optimization phpmyadmin


【解决方案1】:

简答:切换到 Innodb

MyISAM 存储引擎使用 BTree 作为索引并创建索引文件。每次插入大量数据时,此索引都会更改,这就是为什么您需要优化表以重新组织索引并重新获得一些空间。

与 Innodb 相比,MyISAM 的索引机制占用更多空间。

阅读下面的链接 http://www.mysqlperformanceblog.com/2010/12/09/thinking-about-running-optimize-on-your-innodb-table-stop/

Innodb 与 MyISAM 相比还有很多其他优势,但这是另一个话题。

【讨论】:

  • InnoDB 也使用 B 树作为索引。由于 InnoDB 的聚集索引,您可能会获得更差的插入性能。
  • 是的,它使用 B-tree,但它以不同的方式存储它们。不,这在一天之内不再是真的。如果你正确配置 innodb,它会在每种情况下执行 MyISAM。更不用说 MVCC 可以防止锁定并使备份更容易
  • 不是我能想到的,但是如果您使用的 MySQL 早于 5.6,MyISAM 是唯一具有全文搜索的存储引擎。但 innodb 现在支持全文搜索
  • 答案的第二部分是,phpmyadmin 只是根据任意公式猜测。仅仅因为一个工具表明一个动作是合适的,并不意味着你应该相信它,特别是任何据称有一个想法可以帮助你优化或以其他方式“调整”你的服务器的工具。有时,自动建议只是浪费时间;其他时候,它可能对性能有害。遗憾的是,MyISAM 也是唯一支持空间(R-Tree)索引的引擎,但如果您还没有使用它们,那么您可能没有适用于它们的应用程序。 +1 InnoDB ftw。
【解决方案2】:

我将解释插入记录如何影响 MyISAM 表并解释优化的作用,这样你就会明白为什么插入记录会产生如此大的影响。

数据

使用 MyISAM,当您插入记录时,数据只是简单地附加到数据文件的末尾。

在 MyISAM 表上运行优化会对数据进行碎片整理,对其进行物理重新排序以匹配主键索引的顺序。这加快了顺序记录读取(和表扫描)。

索引

插入记录还会将叶子添加到索引中的 B-Tree 节点。如果一个节点填满,它必须被拆分,实际上至少重建索引的那个页面。

在优化 MyISAM 表时,索引会变平,从而在必须重建索引页之前留出更多扩展(插入)空间。这种更扁平的索引还可以加快搜索速度。

统计数据

MySQL 还存储有关键分布的每个索引的统计信息,查询优化器使用此信息来帮助制定良好的执行计划。插入(或删除)许多记录会导致这些统计信息过时。

优化 MySQL 会在索引碎片整理和重建后重新计算表的统计信息。

对比追加

当您添加数据时(添加具有更高主键值的记录,例如使用 auto_increment),该数据不需要稍后进行碎片整理,因为它已经处于正确的物理顺序。此外,当附加(顺序插入)到索引中时,节点保持平坦,因此也不需要在那里进行重建。

对比InnoDB

InnoDB 在插入时遇到同样的问题,但由于数据是由主键保持有序的,因为它的聚集索引,所以你需要预先(在插入时)保持数据有序,而不是必须稍后对其进行碎片整理。尽管如此,优化 InnoDB 确实通过展平 B 树节点并释放未使用(已删除)的键来优化数据,从而改进顺序读取(表扫描),并且二级索引类似于 MyISAM 中的索引,因此它们被重建以展平他们出去。

结论

我并不是要坚持使用 MyISAM。由于聚集索引,InnoDB 具有卓越的读取性能,并且由于记录级锁定与 MyISAM 的表锁定(假设并发用户)相比,具有更好的更新和追加性能。此外,InnoDB 有 ACID。

不过,我的目标是回答您的直接问题并提供一些技术细节,而不是猜测和传闻。

两种数据库存储引擎都不会自动进行自我优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多