首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个表之间的SQL查询效率

问两个表之间的SQL查询效率
EN

Stack Overflow用户
提问于 2014-07-02 06:59:38
回答 2查看 70关注 0票数 2

下面的查询(MySQL)非常慢(大约15秒)。我已经更改了列和表的名称,很抱歉,如果它有任何类型错误;原始查询正在工作,只保留概念,而不是文字查询。

代码语言:javascript
复制
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秒或更短时间:

代码语言:javascript
复制
<?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";

}
?>

我怎么能在没有工会的情况下提高速度呢?

编辑(添加结构):

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-02 07:06:52

请尝试使用以下查询:

代码语言:javascript
复制
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

这应该更快的原因是,这里的最大值(Day)存储在内存中(或者磁盘上的临时表(如果太大),然后连接到表X。在查询中,您读取表X的每一行和查询表all_days的每一行。

票数 2
EN

Stack Overflow用户

发布于 2014-07-02 10:54:40

在这样一个简单的情况下(假设X.id / X.b的组合是唯一的),那么这可以不需要子查询就可以完成:-

代码语言:javascript
复制
SELECT X.id,
        X.b, 
        MAX( all_days.day ) AS day
FROM X
LEFT OUTER JOIN all_days
ON all_days.id = X.id
GROUP BY X.id, X.b
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24524751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档