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

时间:2018-05-04 12:02:31

标签: php mysql sql key relational-database

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

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

首先:我从主表中选择所需的行,这非常快。

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

                )

        )

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

主表看起来像这样:
enter image description here
辅助表看起来像这样:
enter image description here

如果有什么不清楚请告诉我,我可以澄清一下。

3 个答案:

答案 0 :(得分:2)

如果您需要提高性能 确保你有一个合适的索引表mediums column kleding_id

CREATE INDEX my_index  ON mediums (kleding_id); 

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

答案 1 :(得分:2)

您可以在一个查询中执行此操作。但它适用于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的索引。

答案 2 :(得分:0)

无需迭代第一个结果并多次调用第二个表。这总是很慢。

尝试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;