慢查询数据库

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 吗?