查询需要很长时间才能获取数据

时间:2015-06-25 12:21:05

标签: mysql performance mysql-slow-query-log

我知道查询日志慢,但这不适用于超过最长执行时间的查询吗?我的问题略有不同(我认为)。

我正在运行以下查询,对我而言似乎不应该出现问题。但是,当我运行它时,“运行”时间超过20秒,然后它在那里“获取”多年!由于DB性能问题,我必须停止它。

任何人都可以解释我在哪里出错了。编码新手所以请温柔。

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的“部位”(在这种情况下是左臂/右臂等)

我希望这会让它更清晰。

提前致谢。

米奇

2 个答案:

答案 0 :(得分:1)

我认为你只能在select中使用没有子查询的连接,试试看:

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:我还没有测试过代码。

答案 1 :(得分: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_date找到oid
  • 外部查询获取site,但进一步假设给定的oid和日期可能有多个sites
  • 性能需要
  • INDEX(type, date)
  • 性能需要
  • INDEX(fk_oid, date)
  • 我认为type是一个数字,而不是一个字符串。
  • 我重写了日期比较,意味着“在过去的10年里”。如果将来没有行,请获取AND date <= CURDATE()
  • 的ID
  • 因为你似乎只需要oid,所以我摆脱了t1。如果您需要来自t1的更多字段,请添加JOIN t1 WHERE t1.oid = a.fk_oid并引用所需的字段。

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