【问题标题】:Query taking too long on a simple select查询在简单选择上花费的时间太长
【发布时间】:2020-11-06 16:50:19
【问题描述】:

我有一个 Laravel 后端应用程序,它使用使用 Postgres 的多租户数据库,其中每个租户都有一个 SCHEMA。所以我有 2 个表,分别是 bra_product 和 bra_file,它们都有一个来自特定架构的 JOIN,我们称之为“tenant10”。

我有 2500 个模式,每个模式都有两列,我创建了一个名为 MASTER 的模式,其中所有来自模式的表都从那里继承。

所以 ma​​ster.bra_product 拥有来自所有模式的所有产品的所有数据,所以这个简单的查询:

$size = count($productList);
$counter = 0;
for ($i = 0; $i < $size; $i++) {
    $counter++;
    $productList[$i]->srcimglist = $this->mdFile->getMasterImageByProduct($productList[$i]);
}
dd($productList);
return $productList; 

我在这里列出了 20 个产品的列表,我创建了一个循环来获取每个产品的图像列表,这将执行以下操作:

public function getMasterImageByProduct($product) {
    return DB::select("SELECT bra_f.*
                          FROM master.bra_file bra_f
                          WHERE bra_f.product_id = :productId
                          AND bra_f.active = true
                          ORDER BY bra_f.order", ['productId' => $product->product_id]);

}

我的 master.bra_file 有 12.500 行,我的查询需要 40 秒,这是不正常的,我不知道为什么。

【问题讨论】:

  • 我看不出这 2500 个模式在这里有什么相关性。这只是一个表master.bra_file,其中包含 12500 行,查询时间过长。就这样。正确的?还是 master.bra_file 是一个 view 访问那些其他模式中的表?
  • master.bra_file 是一个父表,它有 2500 个子模式,其中有一个名为 bra_file 的表,该表从 master.bra_file 继承
  • master.bra_file 是一个有 12,058 的表是正确的,这个表有这个数字是因为他是你理解的所有模式的所有 bra_file 表的父表?
  • 现在我在删除 ORDER BY bra_f.order 时发现了一些奇怪的东西,我的查询现在需要 5 秒。

标签: sql laravel postgresql


【解决方案1】:

您可以尝试创建另一个表来保存所有子数据并避免继承。

将 bra_file 的结构镜像到另一个“缓存”表中,并使用 INSERT、UPDATE 和 DELETE 触发器自动更新它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多