8

我已经对文件中的缓存数据(序列化/反序列化与 json_encode/decodevar_exportigbonary)和 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 怎么样”?

4

1 回答 1

2

第一个问题

你的操作应该没问题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。他们有一个强大的数据库服务器,显然更愿意在可能的地方使用数据库查询。他们还使用与其数据库服务器分开的负载平衡应用程序服务器。

于 2013-02-14T22:57:26.950 回答