我有一个项目即将到来,其中一个要求是caching什么是基本上只读的数据,以减轻数据库的压力。 我只是有点困惑如何caching与数据库的工作。
高速caching如何工作? 我见过一种叫做查询caching的东西,但是这样做是否caching查询结果呢? 或只是查询? 不是一种cachingforms吗?
我正在寻找一个正确的方向。 该项目将使用MySQL 5.1的商店,所以任何可以清除我的困惑的链接将是一个很大的帮助。 一般的Googlesearch只提供了查询cachingfunction,而且由于我在这方面的知识不足,我不确定这是我应该走的方向。
MySQL查询caching确实caching查询的结果,只要后续查询完全相同,将提供计算结果,而不是实际运行查询。 MySQL也会跳过计算执行计划。
要使用它,可以在服务器的my.cnf 打开它,或者在查询前面使用SQL_CACHE提示。 如果你在my.cnf中打开它,你可以告诉MySQL不要在查询之前使用SQL_NO_CACHE来caching结果。
对表进行任何写入(INSERT,UPDATE,DELETE等)都将使查询caching中来自该表的所有条目无效。
查询caching的一个性能exception:它使用低效的algorithm来查找caching中的条目,因此创build更大的caching可能会导致更糟的性能 。 你应该尝试用自己的数据和查询configuration文件进行更改,但上次我做了这个实验后,发现大约256MB是最佳select。 比这更大或更小,性能变差。 手册build议“ 几十兆字节 ”
你也可以使用memcached之类的东西在MySQL之外实现caching。 这对应用程序来说不是透明的,所以你将不得不在应用程序中添加额外的代码来处理对memcached的查找,然后如果发生错误,在数据库中查找并将结果存储在memcached中。
你可以采取几种方法。 有可能还有其他的方式去做这件事,但是这两件事情都是瞬间想到的。
您可以创build另一个表来保存caching结果,并按计划运行昂贵的查询,这些查询可能会join多个包含大量logging的表,并将logging转储到此表中。 做一个SELECT *从一个表应该是更便宜,做一个SELECT连接12个不同的表,每个表中有数以百万计的logging。 虽然这并不能完全删除数据库服务器上的工作,但它只需要按计划执行昂贵的查询,并让常规客户端从caching表中获取数据,就可以减less计算工作量。
或者,对于与您的数据库完全分离的caching,您可以实施类似Redis的caching。 这会将数据存储在内存中,并且应该超级快,但是在您的应用程序中需要一些额外的逻辑来将其用作数据源而不是实际的数据库。 它的规模也很好 – 堆栈交换networking在他们的站点中非常有效地利用它。