查询在简单选择上花费的时间太长
Posted
技术标签:
【中文标题】查询在简单选择上花费的时间太长【英文标题】: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 的模式,其中所有来自模式的表都从那里继承。
所以 master.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 秒。
【参考方案1】:
您可以尝试创建另一个表来保存所有子数据并避免继承。
将 bra_file 的结构镜像到另一个“缓存”表中,并使用 INSERT、UPDATE 和 DELETE 触发器自动更新它。
【讨论】:
以上是关于查询在简单选择上花费的时间太长的主要内容,如果未能解决你的问题,请参考以下文章
COUNT(id) 查询花费的时间太长,哪些性能增强可能会有所帮助?