我已经对文件中的缓存数据(序列化/反序列化与 json_encode/decode、var_export、igbonary)和 mysql 查询(优化、存储过程、查询缓存)进行了很多搜索,但此刻,我想知道什么是更好的方法优化如下的具体案例。
提前抱歉:我想这是一个很长的话题,但有必要了解这个项目。请原谅我糟糕的英语,这不是我的第一语言。
让我们假设我们有这个数据库关系。
数据库描述(括号中的估计记录数):
- MODULE (10) : 是Item的类型,可以是文章、论坛主题、广告、新闻...
- ITEM (millions) : 任何带有标题和一些文本的类型
- CATEGORY (50) :物品类别(动物、政治、汽车、计算机...)
- TAG(数十万):类别的标签(例如政治:国际,法国,巴拉克奥巴马......)
- ITEM_TAG (outch) : 项目和标签关联
所以我们有几个关系,每个都是 ITEM 创建/更新时的记录器。
我已经使用以下示例将 ITEM 数据缓存在文件夹和文件中:
public function cacheItem()
{
$req=mysql_query("SELECT id, title, content, id_mod, id_cat
FROM ITEM
WHERE ITEM.id='".$this->id."'")or die(mysql_error());
if(mysql_num_rows($req)==1)
{
$this->itemData=mysql_fetch_array($req);
$this->folder=floor($this->id/1000);//1000 items max per folder
$this->itemUrl=$this->folder."/".$this->id.".txt";
if(!file_exists($this->itemUrl))
{
touch($this->itemUrl);
}
file_put_contents($this->itemUrl,serialize($this->itemData),LOCK_EX);
}
}
我得到了它们unserialize(file_get_contents($url))
,这部分就像一个魅力!
现在我希望优化项目列表以通过几个选项(例如)显示它们,foreach 显示每个分页限制为 100:
- 所有项目
- 模块的项目
- 类别的项目
- 类别和模块的项目
- TAG的项目
- TAG 和 CATEGORY 的项目
- TAG 和 CATEGORY 和 MODULE 的项目
我已经知道如何在 SQL 中执行此操作并将结果放入缓存树中。
对于这些缓存文件,我的问题是,当创建/更新新项目时,可能必须非常严格地刷新列表。
第一个问题:
那么如果同时创建/更新 ITEM(这些列表也是如此)会发生什么?
LOCK_EX
将在从 获取文件时完成他的file_put_contents();
工作吗file_get_contents();
?
第二个问题
我知道更多的 PHP 会起作用,更少的 mySQL 会起作用(否则),但是用分页来做这些列表的更好(显示更快)方法是什么,它将每秒或更长时间显示,并且只能通过添加/修改更新一个新项目?
- 我的缓存系统(我不这么认为......)
- mySQL 中的存储过程
- 多个数据库服务器和/或多个文件服务器
- 其他
任何想法,示例,链接都非常感谢。
PS:只是为了好玩,我可能会问“Facebook 怎么样”和“stackoverflow 怎么样”?