Php mysql缓存和memcached的区别

Php mysql缓存和memcached的区别,php,mysql,sql,caching,Php,Mysql,Sql,Caching,我有一个mysql表,它是由管理员严格控制的。数据输入非常低,但该表中的查询较高。由于该表不会对内容进行太多更改,所以我本来打算使用PHP,但(当我在谷歌上搜索时)对memcached感到困惑 memcached和mysqlnd\u qc之间的基本区别是什么 根据以下条件,哪一个最适合我 我还打算将其扩展到完整的盒子,在这种情况下,哪一个合适 我的查询将返回不到30行,其中大部分是非常少的字节数据,并且将具有相同的SELECT查询。我在一台服务器上,不会进行负载共享。先谢谢你 memcach

我有一个mysql表,它是由管理员严格控制的。数据输入非常低,但该表中的查询较高。由于该表不会对内容进行太多更改,所以我本来打算使用PHP,但(当我在谷歌上搜索时)对
memcached
感到困惑

  • memcached
    mysqlnd\u qc
    之间的基本区别是什么
  • 根据以下条件,哪一个最适合我
  • 我还打算将其扩展到完整的盒子,在这种情况下,哪一个合适
我的查询将返回不到30行,其中大部分是非常少的字节数据,并且将具有相同的
SELECT
查询。我在一台服务器上,不会进行负载共享。先谢谢你

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

他们之间没有什么共同之处

根据以下条件,哪一个最适合我

mysql查询缓存

我还打算将其扩展到完整的盒子,在这种情况下,哪一个合适


Sphinx Search

如果您的查询总是相同的,即您确实
选择了书名、stock FROM books,其中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查询缓存时需要注意的一点是,您的查询必须是完全相同的,没有额外的空格和注释。这是因为MySQL根本不进行解析来确定和比较缓存中的查询字符串。查询中的任何额外字符都表示不同的查询


PeterZaitsev在上很好地解释了MySQL查询缓存,值得一看。请确保您不需要任何MySQL查询缓存不支持的内容,如Peter Zaitsev所述。

如果查询运行速度足够快,并且没有真正降低应用程序的速度,请不要缓存它。对于这么小的表,MySQL将把它保存在自己的缓存中。如果您的应用程序和数据库位于同一台服务器上,那么好处将非常小,甚至可能根本无法衡量

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

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


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

感谢您的回复,但它们不是都在缓存mysql查询吗??对于第三个问题,我正在为城市的每个字母表进行ajax调用。我试图在我的自动完成文本框(Sphinx不适合我)中缓存此类静态sql查询。对于我的自动完成文本框,我将缓存2-3个字母表的所有可能组合,感谢您的建议。选中该链接。我最终还是坚持使用Mysql缓存的例子,因为我的需求很简单,暂时避免了复杂的
memcached
(反正不是一个服务器人员)。我能确定的是,Memcached可以用于更复杂的缓存(不同的结果/不同的方式),但还有一个疑问。我希望mysql缓存将可用于各种用户/会话,而不是每个用户/会话,因此缓存结果将持续用于具有相同
SELECT
query的其他用户查询!因为缓存发生在MySQL上,所以它无论如何都不应该依赖于您的用户。请参阅“查询缓存在会话之间共享,因此可以发送一个客户端生成的结果集来响应另一个客户端发出的相同查询。”