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 上有一个索引。
我有两个关系 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 上有一个索引。