我有两个关系表,我都需要数据。第一个(主)表包含大约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
)
)
)
所以我的问题是如何在尽可能短的时间内有效地运行这个查询结构。
如果有什么不清楚请告诉我,我可以澄清一下。
答案 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;