使用MySQL缓存数据

使用MySQL缓存数据,mysql,caching,Mysql,Caching,我想在MySQL上缓存数据 SET GLOBAL query_cache_size = SOME_SIZE; 这就是在MySQL中[高效]缓存数据所需要的一切吗 我是否需要添加一些额外的内容来有效地使用缓存 我对数据缓存没有很好的了解,但仍然需要使用它来解决性能问题,因此,如果我没有提供一些重要信息,请假设系统处于默认状态,回答这个问题。MySQL中有很多设置用于缓存不同的内容。这是优化MySQL的好指南: 请小心,查询缓存的功能非常具体: 查询缓存存储查询的文本 SELECT语句与 发送到的

我想在MySQL上缓存数据

SET GLOBAL query_cache_size = SOME_SIZE;
这就是在MySQL中[高效]缓存数据所需要的一切吗

我是否需要添加一些额外的内容来有效地使用缓存


我对数据缓存没有很好的了解,但仍然需要使用它来解决性能问题,因此,如果我没有提供一些重要信息,请假设系统处于默认状态,回答这个问题。

MySQL中有很多设置用于缓存不同的内容。这是优化MySQL的好指南:


请小心,查询缓存的功能非常具体:

查询缓存存储查询的文本 SELECT语句与 发送到的相应结果 客户。如果一个相同的语句 之后,服务器 从查询中检索结果 缓存而不是解析和 再次执行该语句。

因此,如果相关表中的任何内容发生更改,或者甚至重新编写了查询,则不会使用缓存。因此,
select*fromtwhereid in(1,2)
select*fromtwhereid in(2,1)
是不同的

SHOW VARIABLES LIKE '%query_cache%';
将显示缓存的当前设置。但这并不像打开它那么简单,您运行的查询需要具有可缓存的结果集,并且需要更多的注释框来解释这一点


如果您有一个您认为应该缓存的特定查询,那么发布它,我们可以确定它是否可以缓存。

我通常不建议使用MySQL查询缓存。从理论上讲,这听起来不错,但不幸的是,对于高效缓存来说,这并不是一个很大的胜利,因为从查询中访问它是由互斥体控制的。这意味着许多并发查询排队以获得对查询缓存的访问权,如果您有许多并发客户端,这对您的危害大于帮助

它甚至会损害INSERT/UPDATE/DELETE,即使这些查询没有结果集,因为如果它们更新相同的表,它们会从查询缓存中清除查询结果。这种清除在互斥体上受到相同的排队影响

更好的策略是使用memcached对特定查询结果进行可伸缩的缓存,但这要求您考虑要缓存什么,并编写应用程序代码来访问memcached,如果缓存中不存在数据,则返回MySQL。这是更多的工作,但如果你做得对,它会带来更好的结果