【问题标题】:PHP/MySQL Query Optimization?PHP/MySQL 查询优化?
【发布时间】:2011-10-27 10:30:22
【问题描述】:

我有一个按预期工作的查询,但是,我想优化它以使用更少的查询。

以下代码来自我为公告板系统创建的用户奖牌插件。

$types = array('numposts', 'numthreads', 'numreps');
$medals = "";

foreach($types as $type)
{
    $query = $db->query("
        SELECT u.*, m.* 
        FROM ".TABLE_PREFIX."medals_".$type." m
        LEFT JOIN ".TABLE_PREFIX."medals u ON (m.".$type."_id=u.awid)
        WHERE awuid='".intval($post['uid'])."' AND type='".$type."'
        ORDER BY `".$type."` DESC LIMIT 1
    "); 

    while($results = $db->fetch_array($query))
    {
        $medals .= "<img src=\"uploads/medals/".$results['icon']."\" border=\"0\" alt=\"".$results['descrition']."\" title=\"".$results['description']."\" /> ";
    }
}

对于每个帖子,它都会运行此查询以显示用户的奖牌。根据帖子的数量,查询乘以三。因此,例如,如果一个线程有 10 个帖子...10x3 是 30...仅此代码执行 30 个查询。

优化它以使用更少查询的最佳方法是什么?也许缓存?我不太擅长优化,所以在这里征求您的意见。

【问题讨论】:

  • 既然“帖子数”是更严重的乘数,我们不应该也看到这段代码吗?

标签: php mysql optimization foreach query-optimization


【解决方案1】:

帖子表中的链接,因此您只能为那些帖子实际正在显示的用户获取奖牌。如果您单独运行此查询,则每个用户只会获得 1 条奖牌列表记录,您可以将其存储在数组或其他变量中。

当您开始显示帖子时,您可以返回奖牌列表并调出用户的奖牌。如果(例如)您的 10 个帖子中只有 2 人聊天,那么这将花费您一个查询来获取 2x3=6 行数据(2 个用户 x 3 种类型的奖牌),以及一些内存来存储奖牌结果,而您实际上获取/显示帖子。

【讨论】:

  • 这只是一个插件...帖子表已经通过公告板的核心代码链接。它只获取正在显示帖子的用户的奖牌,但是它正在为每个帖子执行此查询。我想以某种方式只对属于线程一部分的每个用户执行一次此查询。
  • 如果您无法将代码向上移动并将其附加到获取后的代码中,则使用静态变量来存储用户 ID 及其奖牌数据。仅当用户 ID 不在该静态数组中时才执行查询。如果是,则返回数组数据。否则获取数据,将其存储在数组中,然后返回数组数据。
  • 您能详细说明一下吗?也许提供一个示例代码。
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2011-01-22
  • 2011-07-07
  • 2018-12-21
相关资源
最近更新 更多