PHP,MySQL内存DB和memcached

时间:2009-08-29 05:30:01

标签: php mysql memcached

我的网站在没有memcached的共享主机中运行。 那么,如同像memcached一样将MySQL内存数据库作为对象缓存呢?

2 个答案:

答案 0 :(得分:14)

我想说如果你运营一个需要memcached的网站,你就不应该在共享主机上运行它。

这是我轻率的回答。这是一个真正的答案:

与MEMORY存储引擎相比,Memcached具有一些优势。

  • 存储分布在多个服务器上。 MEMORY存储引擎仅限于一台主机,并受该主机的CPU和内存的限制。
  • 快速访问各个条目。 MEMORY存储引擎只有表级锁定,因此并发性受损。
  • 非关系键/值存储。 MEMORY存储引擎更加结构化,对缓存类型的使用没有用。此外,MEMORY将varchar扩展为全长,因此存储效率较低。

作为缓存解决方案,我不会选择MySQL MEMORY存储引擎。由于您使用的是PHP,因此您应该使用APC或Xcache等。它们具有数据缓存功能,这些功能更适合PHP中的典型用法。

如果您没有使用这些PHP缓存技术,那么这是一个比担心memcached与MEMORY存储引擎相关的更重要的改进领域。

答案 1 :(得分:1)

我同意Bill的意见,你不会以这种方式使用MySQL获得相同的性能提升。

可以想像:

确保您的主机已启用内存存储引擎。

SHOW ENGINES;

这将显示mysql实例中安装的所有存储引擎的列表和状态。

Memcache允许您存储任何长度的数据。在内部,它检查您的数据以查看它的长度,并将其放入预先分配的内存桶中,该内存桶最接近您存储的项目的大小。那部分逻辑,你需要自己实现。 MySQL的内存存储引擎只接受固定长度的行。要在mysql中获得类似的效果,您需要在内存表中创建多个具有不同长度的char字段以存储数据。 http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html

选择所有“桶”之间具有联合的表将产生正确的值,无论密钥实际存储在哪个表中。

如果你将数据存储在一个比字段长的字段(例如16个char字段中的18个字符)中,那么mysql将使用mysql进行存储,mysql将截断它而不会出现任何错误。

这是一个更好的主意:将Zend_Cache与'file'后端一起使用。 这将在webservers本地磁盘上存储像memcache一样的东西。 连接到共享主机中的数据库通常很昂贵。 (对于我的godaddy帐户的第一次连接,1到2秒。)即使是慢速磁盘也比这快。 http://framework.zend.com/manual/en/zend.cache.html