我最近升级了Joomla!使用大型文章数据从1.5安装到1.7,升级方法是升级数据库(基本上将内容插入另一个表)我注意到行列值以波浪号为前缀(〜 ):
现在,乍一看我认为这意味着该值是近似的,因为当我刷新页面时,我看到一个不同的值,有时更高,有时更低。好吧,让我们说这个值是近似的,在这种情况下,是什么导致了这个?一些注意事项:
答案 0 :(得分:11)
行计数是InnoDB用于查询优化的近似值。执行计数(*)效率要低得多,并且大致了解行数足以优化查询计划。 phpMyAdmin将执行“show table status”查询以获取有关表的信息:
http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html
对于其他存储引擎,例如InnoDB,此值为 近似值,可能会从实际值变化多达40到 50%。在这种情况下,请使用SELECT COUNT(*)来获得准确的计数。
答案 1 :(得分:7)
根据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 STATUS
的{{3}},显示的InnoDB
行数可能与实际数量相差最多50%。
答案 2 :(得分:1)
表格类型是什么? MyISAM表在其元数据中存储精确的行数。 InnoDB表不能,因为确切的行数取决于“在飞行中”的交易,因此显示的计数被标记为估计(〜=“近似”)而不是“它正是这么多”