2015-06-25 147 views
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的「部位」(在本例中爲左臂/右臂等)

我希望這可以使它更清晰。

在此先感謝。

米奇

+0

第一件事,第一:當查詢運行速度慢,總是做就可以了'EXPLAIN'(和結果添加到您的問題,請)。 – watery

回答

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:我沒有測試的代碼。

+0

非常感謝。這工作得很快,但它爲某些oid返回了多行,因爲有不同日期的條目。如果有倍數,我想返回第一個日期。這就是爲什麼我認爲子查詢會起作用。 –

+0

對不起,我沒有正確理解,你能解釋一點,所以我們可以按照你需要的方式來完成它嗎? – alexandreferris

+0

@MikeDWakelyn嘗試將'LEFT JOIN'改爲'INNER JOIN',看看它是否會返回你想要的結果。 – alexandreferris

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並引用所需的字段。

(我刪除我的其他答案。)

+0

感謝您的答案傢伙。有用! –

相關問題