1

我知道慢查询日志,但这不只是针对超过最大执行时间的查询吗?我的问题略有不同(我认为)。

我正在运行以下查询,对我来说它似乎不应该出现问题。但是当我运行它时,“运行”时间超过 20 秒,然后它就在那里“抓取”了很长时间!由于数据库性能问题,我不得不停止它。

谁能解释我在这里出错的地方。编码新手,所以请温柔。

SELECT 
t1.oid,
(SELECT 
        DATE_FORMAT(t2.date,
                    '%d/%m/%y') AS 'AVF Date'
    FROM
        t2
    WHERE
        t1.oid = t2.fk_oid
            AND t2.type = '-25'
            AND YEAR(t2.date) BETWEEN 2005 AND 2014
    ORDER BY t2.date ASC
    LIMIT 1) AS 'AVF Date',
t2.site 
FROM
t1
left join t2 on t1.oid=t2.fk_oid

更新 - 好的,所以我需要如下。我们有一个患者数据库,这些患者的程序记录在该数据库中。我正在尝试返回患者 oid (t1.oid) 以及他们拥有的 FIRST 程序(如果它是在 2005 年和 2014 年之间)以及他们拥有它的地方(分别为 t2.date 和 t2.site),但前提是程序属于特定类型 (t2.type = '-25')

所以基本上。所有在 2005 年至 2014 年间发生 AVF 的患者以及 AVF 的“部位”(在这种情况下是左臂/右臂等)

我希望这使它更清楚一点。

提前致谢。

米奇

4

2 回答 2

1

我认为您只能在选择中使用没有子查询的联接,试试看:

SELECT t1.oid, DATE_FORMAT(t2.date,'%d/%m/%y'),t2.site
FROM table1 AS t1
LEFT JOIN table2 AS t2
ON t1.oid = t2.fk_oid
WHERE
    t2.type = '-25'
    AND YEAR(t2.date) BETWEEN 2005 AND 2014
ORDER BY t2.date ASC
LIMIT 1;

ps:我没有测试过代码。

于 2015-06-25T12:40:18.040 回答
0
SELECT  a.fk_oid AS oid,
        DATE_FORMAT(a.first_date, '%d/%m/%y') AS 'AVF Date',
        GROUP_CONCAT(b.site) AS "site(s)"
    FROM  
      ( SELECT  fk_oid,
                MIN(date) AS first_date
            FROM  site
            WHERE  date >  CURDATE() - INTERVAL 10 YEAR
              AND  date <= CURDATE()
              AND t2.type = -25
            GROUP BY  fk_oid 
      ) AS a
    JOIN  site AS b
    WHERE  b.fk_oid = a.fk_oid
      AND  b.date   = a.first_date ; 
  • 内部查询查找first_datefor each oid
  • 外部查询得到site,但进一步假设给定的 oid 和日期可能有多个sites
  • INDEX(type, date)需要性能
  • INDEX(fk_oid, date)需要性能
  • 我假设type是一个数字,而不是一个字符串。
  • 我重写了日期比较以暗示“过去 10 年”。如果未来没有行,则获取 id 的AND date <= CURDATE().
  • 由于您似乎只需要oid,因此我摆脱了 t1. 如果您需要 t1 中的更多字段,请添加JOIN t1 WHERE t1.oid = a.fk_oid并引用所需的字段。

(我正在删除我的另一个答案。)

于 2015-07-08T16:36:16.797 回答