【问题标题】:Difference between mysql cache and memcachedmysql缓存和memcached的区别
【发布时间】:2016-02-13 03:08:42
【问题描述】:

我有 1 个由管理员严格控制的 mysql 表。数据输入非常低,但该表中的查询量很高。由于表格不会改变太多内容,我想将mysql query cache 与 PHP 一起使用,但对memcached 感到困惑(当我用谷歌搜索时)。

  • memcachedmysqlnd_qc 之间的基本区别是什么?
  • 根据以下条件,哪种最适合我?
  • 我还打算为自动完成框扩展相同的内容,这将适合这种情况?

我的查询将返回少于 30 行的数据,其中大部分是很少字节的数据,并且将具有相同的 SELECT 查询。我在单个服务器上,不会进行负载共享。提前谢谢你。

【问题讨论】:

    标签: php mysql sql caching


    【解决方案1】:

    如果您的查询始终相同,即您执行SELECT title, stock FROM books WHERE stock > 5 并且您的条件永远不会更改为stock > 6 等,我建议使用 MySQL 查询缓存。

    Memcached 是一个键值对存储。基本上它可以缓存任何东西,如果你可以把它变成 key => value。有很多方法可以用它来实现缓存。您可以从数据库中查询 30 行,然后逐行缓存它,但如果您一遍又一遍地返回相同的行集,我看不出有这样做的理由。我能想到的 memcached 最基本的例子是:

    // Run the query
    $result = mysql_query($con, "SELECT title, stock FROM books WHERE stock > 5");
    
    // Fetch result into one array
    $rows = mysqli_fetch_all($result);
    
    // Put the result into memcache.
    $memcache_obj->add('my_books', serialize($rows), false, 30);
    

    然后执行$memcache_obj->get('my_books'); 并对其进行反序列化以获得相同的结果。

    但是由于您一遍又一遍地使用相同的查询。当您可以让 MySQL 为您处理所有缓存时,为什么还要添加复杂功能?请记住,如果您使用 memcached 选项,您需要设置 memcached 服务器以及实现逻辑来检查结果是否已经在缓存中,或者数据库中的记录是否已更改。

    在这种情况下,我建议使用 MySQL 查询缓存而不是 memcached。

    但是,您需要注意 MySQL 查询缓存的一件事是,您的查询必须完全相同,不能有多余的空格、cmets。这是因为 MySQL 根本没有解析来确定比较缓存中的查询字符串。查询中某处的任何额外字符都表示不同的查询。

    Peter Zaitsev 在http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/ 上很好地解释了 MySQL 查询缓存,值得一看。确保您不需要任何 MySQL Query Cache 不支持的东西,正如 Peter Zaitsev 提到的那样。

    【讨论】:

    • 检查了那个链接。我终于坚持使用php.net/manual/en/mysqlnd-qc.quickstart.caching.php 的 Mysql 缓存示例,因为我的需求很简单,暂时避免复杂的memcached(反正不是服务器人)。我能说的是 Memcached 可以用于更复杂的缓存(不同的结果/不同的方式)只有一个疑问。我希望 mysql 缓存可用于各种用户/会话,而不是每个用户/会话,因此缓存结果将持续存在于具有相同 SELECT 查询的其他用户查询!
    • 由于缓存发生在 MySQL 上,它不应该依赖于您的用户。请参阅dev.mysql.com/doc/refman/5.1/en/query-cache.html“查询缓存在会话之间共享,因此可以发送一个客户端生成的结果集以响应另一个客户端发出的相同查询。”
    【解决方案2】:

    如果查询运行得足够快并且不会真正减慢您的应用程序,请不要缓存它。对于这么小的表,MySQL 会将其保存在自己的缓存中。如果您的应用程序和数据库在同一台服务器上,那么收益将非常小,甚至可能根本无法衡量。

    因此,对于您的第三个问题,它还取决于您如何查询基础表。大多数时候,让 MySQL 在内部缓存它就足够了。另一种方法是生成所有可能的组合并存储它们,因此 mysql 不需要计算匹配的行并立即返回正确的行。

    作为一般规则:在不使用缓存的情况下构建您的应用程序,并且只为不经常更改的内容添加缓存,如果 a) 结果集的计算复杂且耗时,或者 b) 您有多个应用程序实例通过网络调用数据库.在这些情况下,缓存会带来更好的性能。

    另外,如果您在像 Apache 这样的 Web 服务器中运行 PHP,那么在您的程序中进行缓存并不会带来太多好处,因为它只使用当前页面的缓存。然后需要一个外部缓存(如 memcache)来缓存多个结果。

    【讨论】:

    • 对于我的自动完成文本框,我将缓存 2-3 个字母的所有可能组合,感谢您的建议。
    【解决方案3】:

    memcached 和 mysqlnd_qc 之间的基本区别是什么?

    他们之间没有什么共同点

    根据以下情况,哪个最适合我?

    mysql查询缓存

    我还打算为自动完成框扩展相同的功能,这将适合这种情况?

    狮身人面像搜索

    【讨论】:

    • 谢谢你的回复,但他们不是都在缓存mysql查询吗??对于第三个问题,我正在为每个城市字母表进行 ajax 调用,试图在我的自动完成中缓存此类静态 sql 查询(Sphinx 不适合我)
    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 2011-12-10
    • 2013-10-25
    • 2014-09-24
    • 2014-03-03
    • 1970-01-01
    • 2019-12-01
    • 2010-11-22
    相关资源
    最近更新 更多