MySQL的关键困境

时间:2012-02-23 00:47:43

标签: php mysql caching

我有一个表将数据缓存(共享主机,因此没有memcached)到MySQL表。

这个概念是这样的:

我有一个加载(静态)数据然后缓存的页面:

  • 如果缓存不存在,则查询页面然后呈现HTML并将其保存到缓存表。
  • 如果缓存中不存在某个页面,它会执行12个查询(菜单,页面内容,搜索引擎优化,产品列表等),然后将呈现的HTML保存在表格中。

缓存表是这样的:

=cache=
url varchar(255) - primary key
page mediumtext

现在我认为我做的是正确的事情,基于我拥有的东西(共享主机,没有像memcached那样的缓存等)但我的问题是:

由于网址是varchar索引,但因为数字ID(例如int)速度较快,有没有办法将/contact-us//product-category/product-name/之类的网址转换为一个唯一的整数?或者还有其他方法来优化它吗?

3 个答案:

答案 0 :(得分:2)

我会创建一些形式的哈希,它允许更短的密钥。在许多情况下,像请求路径的哈希这样简单的东西可能是可行的。或者更简单的东西,如CRC32('/ your / path / here')可能适合您的情况作为主键。在此示例中,将存在以下列

 urlCRC INT(11) UNSIGNED NOT NULL (PRIMARY KEY)
 url VARCHAR(255) NOT NULL
 page MEDIUMTEXT

然后你可以更进一步,并添加触发器BEFORE INSERT,它将计算urlCRC的值,即包含

NEW.urlCRC = CRC32(NEW.url)

然后,您可以创建一个存储过程,该过程在URL(字符串)中作为参数,并在内部执行

SELECT * FROM cacheTable WHERE urlCRC = CRC32(inURL);

如果返回的行数为0,则可以触发逻辑来缓存它。

这当然可能是矫枉过正,但会为你提供一个数字键来处理,假设没有冲突就足够了。通过将url存储为VARCHAR(255),如果确实发生了冲突,您可以使用不同的算法轻松地重新生成新的哈希值。

为了清楚起见,我只是使用CRC32()作为我头顶的一个例子,很可能有更合适的算法。需要注意的一点是,数字键的搜索效率更高,因此如果您可以将字符串转换为唯一数字,则在检索数据时效率会更高。

答案 1 :(得分:0)

如果表中没有其他动态大小的列(TEXT),则将url列更改为固定大小的字符串会使索引稍快一些。根据您的URL结构,可以将其转换为整数 - 您也可以使用某种哈希函数。但为什么不让你的生活更轻松?

您可以将缓存结果直接保存到磁盘并创建一个mod_rewrite过滤器(将其置于您的.htaccess文件中),如果文件存在则匹配,否则调用PHP脚本。这有两个好处:

  1. 如果缓存很热,PHP将无法运行。这样可以节省时间和内存。
  2. 如果文件经常被请求并且足够小(或者你有大量的RAM),它将被保存在RAM中。这比MySQL快得多。

答案 2 :(得分:0)

选择所有带有哈希的缓存网址,然后在所有哈希分支中搜索精确网址

select page from (select * from cache where HASHEDURL = STOREDHASH) where url = 'someurl'