mysql表

时间:2015-10-08 01:54:06

标签: mysql sql caching

我想在网站上显示队列中的提醒数量作为统计信息。该统计信息是我表中的行数。我过去一直在做的是有一个单独的表来缓存数字。缓存表只有一行,一列包含提醒表中的行数。每次添加新提醒时,我都会有另一个查询将值递增一个。

我最近开始将count()功能合并到我的项目中。我的问题是;是否更好的性能是在桌面上执行count()操作以在每次有人加载页面时显示当前的提醒数量(统计数据显示在页脚中),或者更快地将该数字存储在页面中另一张桌子让我只是从那张桌子上读书?在什么时候使用缓存值而不是count函数会更快?

3 个答案:

答案 0 :(得分:1)

与最优化相关的问题一样,答案是:嗯,这取决于。

如果你的表使用myisam表类型,那么行数已经缓存在表本身中,count(*)没有where将读取该数字。

如果你使用innodb表引擎并且你有很多插入和少选择,那么保持计数将比计算行更昂贵。如果你没有太多的插入,那么使用缓存的数字可能会更快,因为innodb在count(*)没有where的情况下相对较慢。

有关innodb的详细说明,请参阅mysql performance blog on count(*)

答案 1 :(得分:1)

如果您正在考虑缓存行数,您可能不应该这样,而且您可能不需要它。有一个内置机制

SHOW TABLE STATUS

该查询的部分输出包括:

  

行数。一些存储引擎,如MyISAM,存储   准确计数。对于其他存储引擎,例如InnoDB,此值为   近似值,可能与实际值有差异多达40   到50%。在这种情况下,使用SELECT COUNT(*)来获得准确的结果   计数。

     

INFORMATION_SCHEMA数据库中的表的Rows值为NULL。

本段还回答了关于SELECT COUNT(*)效率的问题 - 在MyISAM表上它的速度很快,它不依赖于表中的行数,因为使用了内部计数器。

innodb有何不同?

  

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

请注意,文档的这一部分确实提到了缓存计数。但是你会注意到,如果有一个索引完全覆盖了表,那么count(*)查询仍然很快。由于您自然拥有主键,并且主键可能至少部分位于缓冲区中,因此性能影响可以忽略不计。

请注意,其他流行的开源数据库Postgresql中的故事完全不同。 count(*)与表大小成比例地减慢。谢天谢地,在mysql中它并不是那么糟糕。

总结:由于缓存的行数仅为近似值,因此您只需使用show table status。

答案 2 :(得分:0)

您在问是否更好地使用count功能?从技术上讲,这是更好的方法,但这总是取决于你的数据有多大,如果处理大量数据,每次页面加载的调用计数都不是一个好主意,因为它会影响页面的呈现,在这种情况下,它会使页面加载速度太慢,如果你在计算少量数据,那么这是好的和更好的方法。