慢查询数据库
Slow Querying DB
我目前正在优化一个有许多 table 连接的系统。
我现在正在处理的部分正在显示 table 订单。问题是在这个 table 中还有很多关系(大约 10 个)我正在查询。问题本身在于查询那么多关系。我一直在使用 Eloquent + with() 方法进行预加载,但页面已经变慢了,即使它只有不到 3000 个订单。问题是,在 table 中,我还打印了来自 1:N 关系的数据(例如,一个订单有很多负载,在 table 中,我打印了第一个负载的城市)
因此,由于 eloquent 和预加载已经变得很慢,我决定切换到查询生成器。但它有一些缺陷,我不知道如何解决。
查询本身已经很大:
$orders = DB::table('orders')
->select([
//around 25 different selects
])
// nearly 10 left joins on other tables
->leftJoin(...)
// a few when-s with nested where-s, orderBy-s and so on
->when(...)
->get();
首先,我使用连接将 table 数据连接在一起,这在 (table)1:N(orders) 的情况下很好,但在连接时成为问题(orders)1:N(table),因为我并不是真的想加入所有这些记录。对于几乎所有这些,我只需要最新或第一条记录。
我决定使用的第一个选项是 select 中的子查询,我很快意识到这是一个巨大的错误,因为它对每一行都执行。然后我通过将子查询加入我的 table 找到了解决方案,但是查询花费的时间太长(我只连接了一个这样的查询是 8 秒,我应该加入 6 次)
->leftJoin(DB::raw("(SELECT t1.fileable_id, t1.filename FROM files t1 INNER JOIN (SELECT fileable_id, MAX(created_at) AS max_created_at FROM files WHERE fileable_type = 'App\Order' GROUP BY fileable_id) t2 ON t2.fileable_id = t1.fileable_id AND t2.max_created_at = t1.created_at) AS contractor_files"), 'contractor_files.fileable_id', '=', 'orders.id')
我想问问有没有解决办法。如果需要,我可以 post 整个查询,但它大约有 100 行长,并且总结得差不多了
查询有问题。但这可能有助于子查询:
INDEX(fileable_type, fileable_id, created_at)
此外,您不需要在 ON
子句中包含 fileable_type
吗?
我目前正在优化一个有许多 table 连接的系统。
我现在正在处理的部分正在显示 table 订单。问题是在这个 table 中还有很多关系(大约 10 个)我正在查询。问题本身在于查询那么多关系。我一直在使用 Eloquent + with() 方法进行预加载,但页面已经变慢了,即使它只有不到 3000 个订单。问题是,在 table 中,我还打印了来自 1:N 关系的数据(例如,一个订单有很多负载,在 table 中,我打印了第一个负载的城市)
因此,由于 eloquent 和预加载已经变得很慢,我决定切换到查询生成器。但它有一些缺陷,我不知道如何解决。
查询本身已经很大:
$orders = DB::table('orders')
->select([
//around 25 different selects
])
// nearly 10 left joins on other tables
->leftJoin(...)
// a few when-s with nested where-s, orderBy-s and so on
->when(...)
->get();
首先,我使用连接将 table 数据连接在一起,这在 (table)1:N(orders) 的情况下很好,但在连接时成为问题(orders)1:N(table),因为我并不是真的想加入所有这些记录。对于几乎所有这些,我只需要最新或第一条记录。
我决定使用的第一个选项是 select 中的子查询,我很快意识到这是一个巨大的错误,因为它对每一行都执行。然后我通过将子查询加入我的 table 找到了解决方案,但是查询花费的时间太长(我只连接了一个这样的查询是 8 秒,我应该加入 6 次)
->leftJoin(DB::raw("(SELECT t1.fileable_id, t1.filename FROM files t1 INNER JOIN (SELECT fileable_id, MAX(created_at) AS max_created_at FROM files WHERE fileable_type = 'App\Order' GROUP BY fileable_id) t2 ON t2.fileable_id = t1.fileable_id AND t2.max_created_at = t1.created_at) AS contractor_files"), 'contractor_files.fileable_id', '=', 'orders.id')
我想问问有没有解决办法。如果需要,我可以 post 整个查询,但它大约有 100 行长,并且总结得差不多了
查询有问题。但这可能有助于子查询:
INDEX(fileable_type, fileable_id, created_at)
此外,您不需要在 ON
子句中包含 fileable_type
吗?