sql 查询需要很长时间才能完成

sql query takes ages to complete

我有两个关系 table,我都需要它们的数据。第一个(主要)table 包含大约 90k 行。辅助 table 包含大约 200k 多行。

我需要将辅助 table 的一些数据添加到我从第一个 table 获得的结果中,目前我分两部分进行此操作:

首先:我 select 从 Main table 中获取所需的行,这非常快。

$records = getData($conn, "
SELECT id 
  from Main 
 where contains_tags is not null 
   and contains_mediums is not null 
   and contains_techniques is not null 
 limit 100
");

- 然后我检查每条记录以添加来自辅助 table 的额外数据但这需要很长时间(100 条记录 1 分钟 50 分钟 - 5k 记录 100 分钟。最后我需要 运行 这个查询对于 Main table 的大约 5-10k 行)。有没有办法加快这个过程?

foreach ($records as $r => $record) {
    $records[$r]['mediums'] = getData($conn, "SELECT medium from mediums where kleding_id = ".$record['id']."");
    kleding_id = ".$record['id']."");
}

这是两个查询完成后所需的输出:

[1] => Array
        (
            [id] => 15
            [mediums] => Array
                (
                    [0] => Array
                        (
                            [medium] => wol
                        )

                    [1] => Array
                        (
                            [medium] => katoen
                        )

                )

        )

所以我的问题是如何在尽可能短的时间内有效地运行 这个查询结构。

主要 table 看起来像这样:

辅助 table 看起来像这样:

如果有任何不清楚的地方,请告诉我,以便我澄清。

无需遍历第一个结果并多次调用第二个 table。这总是很慢。

尝试 inner join 在一个 sql 语句中聚合来自两个 table 的数据。

SELECT
    Main.id,
    mediums.medium
from
    Main
inner join mediums on
    (
        Main.id = mediums.kleding_id
    )
where
    contains_tags is not null
    and contains_mediums is not null
    and contains_techniques is not null limit 100;

如果您需要提高性能 确保你有一个合适的索引 table 媒介列 kleding_id

CREATE INDEX my_index  ON mediums (kleding_id); 

记住限制(对于不是最近的数据库版本)通常对结果有效..a 并且在达到前 100 后不会中断

您可以在单个查询中完成。但它适用于 mysql Verison 5.7 及更高版本。

SELECT id, GROUP_CONCAT(json_object('medium', mediums.medium))
FROM Main
LEFT JOIN mediums ON Main.id = mediums.kleding_id
WHERE contains_tags IS NOT NULL AND contains_mediums IS NOT NULL AND contains_techniques IS NOT NULL
GROUP BY Main.id
LIMIT 100

还要确保您在 kleding_id 上有一个索引。