我有一个表将数据缓存(共享主机,因此没有memcached)到MySQL表。
这个概念是这样的:
我有一个加载(静态)数据然后缓存的页面:
缓存表是这样的:
=cache=
url varchar(255) - primary key
page mediumtext
现在我认为我做的是正确的事情,基于我拥有的东西(共享主机,没有像memcached那样的缓存等)但我的问题是:
由于网址是varchar
索引,但因为数字ID(例如int
)速度较快,有没有办法将/contact-us/
或/product-category/product-name/
之类的网址转换为一个唯一的整数?或者还有其他方法来优化它吗?
答案 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脚本。这有两个好处:
答案 2 :(得分:0)
选择所有带有哈希的缓存网址,然后在所有哈希分支中搜索精确网址
select page from (select * from cache where HASHEDURL = STOREDHASH) where url = 'someurl'