【问题标题】:phpMyAdmin - What a tilde (~) means in rows column?phpMyAdmin - 波浪号 (~) 在行列中的含义是什么?
【发布时间】:2011-12-29 14:33:02
【问题描述】:

我最近升级了 Joomla!从 1.5 安装到 1.7 并带有大量文章数据集,而升级方法正在升级数据库(基本上是将内容插入另一个表)我注意到 Rows 列值以波浪号为前缀(〜 ):

现在,乍一看,我认为这意味着该值是近似值,因为当我刷新页面时,我看到一个不同的值,有时更高,有时更低。好的,假设该值是近似值,在这种情况下,是什么原因造成的?一些注意事项:

  • 操作系统:Windows 7。
  • 服务器:带有 PHP 5.3 和 MySQL 5.1.50 社区的 Apache 2。

【问题讨论】:

    标签: php mysql phpmyadmin


    【解决方案1】:

    根据MySQL Manual on InnoDB restrictions

    • SHOW TABLE STATUS 没有给出关于InnoDB 表的准确统计信息,除了表保留的物理大小。行数只是 SQL 优化中使用的粗略估计。

    • InnoDB 不保留表中的内部行数,因为并发事务可能同时“看到”不同数量的行。要处理SELECT COUNT(*) FROM t 语句,InnoDB 必须扫描表的索引,如果索引不完全在缓冲池中,这需要一些时间。如果您的表不经常更改,使用 MySQL 查询缓存是一个很好的解决方案。要获得快速计数,您必须使用您自己创建的计数器表,并让您的应用程序根据它所做的插入和删除来更新它。如果近似行数足够,则可以使用SHOW TABLE STATUS。请参阅第 13.2.13.1 节,“InnoDB Performance Tuning Tips”。

    根据SHOW TABLE STATUSpage,显示的InnoDB 行数可能与实际计数相差最多50%。

    【讨论】:

    • 我不认为这个词意味着你认为它的意思。
    • 我明白了,这只是一个参考。
    【解决方案2】:

    行数是 InnoDB 用于查询优化的近似值。执行 count(*) 效率要低得多,粗略了解行数足以优化查询计划。 phpMyAdmin 将执行“显示表状态”查询以获取有关表的信息:

    http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html

    对于其他存储引擎,例如 InnoDB,此值是 近似值,并且可能与实际值相差多达 40 到 50%。在这种情况下,请使用 SELECT COUNT(*) 获得准确的计数。

    【讨论】:

    • 谢谢bencoder,那我看看换个存储引擎是否方便。感谢您的帮助。
    • 不客气。我不明白为什么这是必要的。您是否依赖 phpmyadmin 的输出来获取某些东西?使用 count(*) 编写一个为您提供正确值的特定页面可能会好得多
    • 不要得出错误的结论。您的设置没有损坏,无需更改存储引擎。
    • 不是真的,所以,将来我可能需要使用全文搜索,所以保留该类型会是更好的方法。
    • 我的建议是在需要的时候转换表格,按照YAGNI的原则。
    【解决方案3】:

    表类型有哪些? MyISAM 表在其元数据中存储准确的行数。 InnoDB 表不能,因为确切的行数取决于“正在运行”中的事务,所以显示的计数被标记为估计值(~ =“大约”)而不是“它正是这么多”。

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 2021-09-15
      • 2020-08-08
      • 2011-05-02
      • 2015-03-07
      相关资源
      最近更新 更多