Mysql 查询获取数据花费的时间太长
我知道查询日志很慢,但这不只是针对超过最大执行时间的查询吗?我想我的问题有点不同 我正在运行下面的查询,对我来说,它似乎不应该出现问题。但是当我运行它的时候,运行时间超过了20秒,然后它就停在那里好长时间了!由于数据库性能问题,我不得不停止它 谁能解释一下我哪里出了问题。编码新手,所以请温柔一点Mysql 查询获取数据花费的时间太长,mysql,performance,mysql-slow-query-log,Mysql,Performance,Mysql Slow Query Log,我知道查询日志很慢,但这不只是针对超过最大执行时间的查询吗?我想我的问题有点不同 我正在运行下面的查询,对我来说,它似乎不应该出现问题。但是当我运行它的时候,运行时间超过了20秒,然后它就停在那里好长时间了!由于数据库性能问题,我不得不停止它 谁能解释一下我哪里出了问题。编码新手,所以请温柔一点 SELECT t1.oid, (SELECT DATE_FORMAT(t2.date, '%d/%m/%y') AS 'AVF Date'
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以及他们在2005年至2014年期间进行的第一次手术,以及他们分别在t2.date和t2.site进行手术的地点,但前提是该手术属于特定类型t2.type='-25'
基本上是这样。所有在2005年至2014年间发生AVF的患者以及AVF的部位(本例中为左臂/右臂等)
我希望这能让事情更清楚一点
提前谢谢
Mikey我认为您可以在选择中仅使用连接而不使用子查询,请尝试:
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;
附言:我还没有测试代码
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 ;
内部查询查找每个oid的第一个\u日期。
外部查询获取站点,但进一步假设给定oid和日期可能有多个站点。
INDEXtype,性能需要日期
INDEXfk_oid,性能需要日期
我假设类型是数字,而不是字符串。
我重写了过去10年中的日期比较。如果没有未来的行,首先要获取id和日期:当查询运行缓慢时,请始终对其进行解释并将结果添加到您的问题中。非常感谢。这工作很快,但它返回了一些oid的多行,因为有不同日期的条目。如果有倍数,我想返回第一个日期。这就是为什么我认为子查询会起作用。很抱歉,我没有正确理解,你能再解释一下吗,这样我们就可以按你需要的方式完成它了?@MikeDWakelyn尝试将左连接更改为内部连接,看看它是否返回你想要的结果。谢谢-运行起来要快得多,但获取数据仍然太长,资源太多。@Gregory Hart-谢谢你的编辑,我已经在查询中添加了t2.site。谢谢大家的回答。有用的