php - MySQL关键困境

标签 php mysql caching

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

这个概念是这样的:

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

  • 如果缓存不存在,则会查询页面,然后渲染 HTML 并将其保存到缓存表中。
  • 如果缓存中不存在页面,则会执行 12 个查询(菜单、页面内容、SEO、产品列表等),然后将呈现的 HTML 保存在表中。

缓存表是这样的:

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

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

因为 URL 是 varchar 索引,但由于数字 ID(如 int)更快,有没有办法转换像 /contact- 这样的 URL us//product-category/product-name/ 为唯一整数?或者还有其他方法可以优化吗?

最佳答案

我会创建某种形式的哈希,以允许更短的 key 。在许多情况下,像请求路径的散列这样简单的东西可能是可行的。或者,像 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() 作为示例,很可能有更合适的算法。要点是数字键的搜索效率更高,因此如果您可以将字符串转换为唯一的数字,那么检索数据时会更高效。

关于php - MySQL关键困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9405548/

相关文章:

javascript - 将 php json 解析为 javascript

mysql - 在 MySQL 数据库中正确创建和持久化

python - 查询存储在 MySQL 中的多级 JSON 对象

c - 提高缓存命中率

spring - 如何在 Java Spring 应用程序中缓存使用 Netflix Feign 库发出的 HTTP 请求

php - 如何处理准备好的语句中的多个查询?

javascript - Ajax MySQL 查询不返回当前数据

php - 为什么这样做? (php 点符号)

mysql - 仅方便访问特定查询结果的最佳方式

php - WordPress 在内存中存储身份验证 token