gpt4 book ai didi

php - 两表间SQL查询效率

转载 作者:行者123 更新时间:2023-11-29 02:24:47 25 4
gpt4 key购买 nike

我有以下非常慢的查询 (MySQL)(大约 15 秒)。我已经更改了列和表的名称,如果有任何类型错误,请见谅;原始查询有效,仅保留概念,不保留文字查询。

SELECT 
id,
b,
(SELECT MAX( day )
FROM all_days
WHERE all_days.id = X.id
) AS day
FROM X

请注意,all_days 有超过 200 万行。我有 3 个索引:一个用于 id,另一个用于日期,另一个用于 {id,day}

但是如果我用 UNION 将 N 个查询中的查询分开,它只需要大约 1 秒或更少的时间就可以得到相同的结果:

<?php
$ids = getIds(); // get all ID from X with a query
$i = 0
foreach ($ids as $id) {
if ($i++ > 0) {
$query .= " UNION ";
}
$query .= "SELECT MAX( day )
FROM all_days
WHERE all_days.id = $id";

}
?>

关于如何在不执行 UNIONS 的情况下提高速度的任何想法?

编辑(添加结构):

Table X:
id INTEGER PRIMARY KEY
b INTEGER -- extra info

Table all_days:
day_id INTEGER PRIMARY KEY
id INTEGER FK X.id
day DATETIME

all_days indexes:
id
day
id,day

最佳答案

请尝试使用此查询:

SELECT 
id,
b,
max_day
FROM X
INNER JOIN
(
SELECT id, MAX(`day`) AS max_day
FROM all_days
GROUP BY id
) AS max_days
ON max_days.id = X.id

这应该快得多的原因是,这里每个 id 的 max(day) 存储在内存中(如果太大,则存储在磁盘上的临时表中),然后连接到表 X。在您的查询中,您读取每个表 X 的行以及您查询表 all_days 的每一行。

关于php - 两表间SQL查询效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24524751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com