提前抱歉:我想这是一个很小的答案的长话题,但是有必要了解这个项目.请原谅我可怜的英语,这不是我的第一语言.
让我们假设我们有这种数据库关系.
数据库的描述(括号中估计的记录数):
> MODULE(10):是项目的类型,可以是文章,论坛主题,广告,新闻……
> ITEM(数百万):任何带有标题和文本的类型
>类别(50):项目类别(动物,政治,汽车,电脑……)
>标签(数十万):类别的标签(例如政治:国际,法国,巴拉克奥巴马……)
> ITEM_TAG(outch):项目和标签关联
所以我们有几个关系,每个关系都是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); } }
我通过反序列化(file_get_contents($url))得到它们,这部分就像一个魅力!
现在我希望优化ITEM列表以通过几个选项(例如)显示它们,foreach显示每个分页限制为100:
>所有项目
>模块的项目
> CATEGORY的项目
> CATEGORY和MODULE的项目
> TAG的ITEM
> TAG和CATEGORY的项目
> TAG,CATEGORY和MODULE的项目
我已经知道如何在sql中执行此操作并将结果放在缓存树中.
使用这些缓存文件的问题是,当创建/更新新的ITEM时,可能必须以非常严格的方式刷新列表.
第一个问题:
那么,如果同时创建/更新ITEM(那些列表也是如此)会发生什么?
是file_put_contents()的LOCK_EX吗?将从file_get_contents()获取文件时完成其工作; ?
第二个问题
我知道更多的PHP可以工作,而不是MysqL(和其他方面),但是更好(显示更快)的方式来做这些带分页的列表,每秒钟或更多时间显示,并且只能通过添加/来修改更新新的ITEM?
>我的缓存系统(我不这么认为……)
> MysqL中的存储过程
>多个数据库服务器和/或多个文件服务器
>其他
任何想法,例子,链接都非常感谢.
附: :只是为了好玩,我可能会问“Facebook怎么样”和“stackoverflow怎么样”?
使用LOCK_EX,您的操作应该没问题.如果同时访问文件可能会被锁定,这肯定会减慢速度,但所有操作都应该正确完成.但是,这是一个很好的示例,为什么您不应该实现自己的缓存系统.
第二个问题:
MysqL肯定会比你的缓存系统更快(除非你做一些严重的wicket编码而不是PHP). MysqL等数据库在优化性能方面做了大量工作.
我不相信MysqL中的存储过程会在上面提供的示例中为普通的旧SELECT查询提供任何真正的好处.
如果在服务器群集上使用分片,使用像MongoDB这样的Nosql方法可以帮助您.这更难写,更多的服务器需要更多的钱.此外,从您的问题中不清楚是否可以选择移动到其他数据库系统.
如果您坚持使用MysqL,那么实现负载平衡应用程序服务器可能比数据库服务器集群更容易.考虑到这一点,PHP完成的更多工作比MysqL中的更多工作更受青睐.我不会遵循这种方法,因为你只是为了一个小的利益而放弃了很多.
简而言之,我建议您坚持使用普通的SELECT查询来获得所需的内容.在不同的服务器上运行您的应用程序和数据库,并为数据库服务器使用功能更强大的服
PS. Facebook为PHP编写了一个预编译器,以使其代码运行得更快.在我看来,PHP不是一种非常快速的语言,你可以从Python或Node.js获得更好的结果.
Stackoverflow使用ASP.NET MVC和MS sql Server.他们有一个强大的数据库强大的服务器,显然他们可以尽可能地使用数据库查询.它们还使用与其数据库服务器分开的负载平衡应用程序服务器.