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

qfe3c7zg  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(529)

我有两个关系表,它们都需要数据。第一个(主)表包含大约90k行。第二个表包含大约200000多行。
我需要将第二个表的一些数据添加到我从第一个表得到的结果中。目前,我分两部分进行:
首先:我从主表中选择所需的行,这会非常快。

$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
");

-然后我检查每个记录,从第二个表中添加额外的数据,但这需要时间(100条记录需要1分钟,50分钟-5公里记录需要100分钟)。最后,我需要对主表的大约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
                        )

                )

        )

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

次表如下所示:

如果有什么不清楚的地方,请告诉我,以便我能澄清。

jv2fixgn

jv2fixgn1#

如果您需要提高性能,请确保您有一个适当的索引表mediums列kleding\u id

CREATE INDEX my_index  ON mediums (kleding_id);

请记住,限制(对于不是最新的db版本)通常对结果起作用..a并且在达到前100个之后不会中断

dtcbnfnu

dtcbnfnu2#

您可以在一个查询中完成。但它适用于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

还要确保你有一个关于kleing\u id的索引。

iyfjxgzm

iyfjxgzm3#

不需要迭代第一个结果并多次调用第二个表。这将永远是缓慢的。
尝试 inner join 在一条sql语句中聚合两个表中的数据。

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;

相关问题