2014-07-16 116 views
0

我有以下查詢,提取我需要的信息,但速度太慢,無法使用。它基本上是兩個表格中的選擇查詢,並且還包括來自另一個表格的計數。我希望得到這方面的一些幫助,因爲現在一直在掙扎幾天。我有一個關於tblDriver狀態列的索引。MYSQL子查詢計數緩慢

SELECT date_format(`tblAvailability`.`adate`,'%e %b %Y') AS `adate`, 
    date_format(`tblAvailability`.`adate`,'%a') AS `aday`, `tblVenue`.`name` AS `name`, 
    tblAvailability.cars, `tblAvailability`.`adate` AS `bdate`, 
`tblAvailability`.`totalslots` AS `totslots`, 
(SELECT count(*) FROM `tblDriver` WHERE ((`tblDriver`.`status` <> 'refunded') and (`tblDriver`.`status` <> 'rejected') and (`tblDriver`.`status` <> 'rebook') and (`tblDriver`.`status` <> 'rebook-cust') and (`tblDriver`.`eventid` = `tblAvailability`.`id`))) AS `bslots` 
    FROM (`tblAvailability` join `tblVenue` on((`tblAvailability`.`idvenue` = `tblVenue`.`id`))) 
    WHERE ((`tblAvailability`.`adate` > now()) 
    AND (`tblAvailability`.`status` <> 'inactive') and (`tblAvailability`.`status` <> 'removed')) 
    GROUP BY `tblAvailability`.`adate`,`tblVenue`.`name` 
    ORDER BY `tblAvailability`.`adate`,`tblVenue`.`name` 

回答

0

這是您的查詢,清理了一下:

SELECT date_format(a.`adate`,'%e %b %Y') AS adate, date_format(a.adate, '%a') AS aday, 
     v.name, a.cars, a.adate AS bdate, a.`totalslots` AS `totslots`, 
     (SELECT count(*) 
     FROM `tblDriver` d 
     WHERE d.status not in ('refunded', 'rejected', 'rebook', 'rebook-cust') and 
       d.eventid = a.id 
     ) AS bslots 
FROM tblAvailability a join 
    tblVenue v 
    on a.idvenue = v.id 
WHERE a.adate > now() AND 
     a.status not in ('inactive', 'removed') 
GROUP BY a.adate, v.name 
ORDER BY a.adate, v.name; 

現在,它是有點可讀的,可以提出建議。 driver(status)上的索引可能沒有幫助。試試這些指標:

tblDriver(eventid, status) 
tblAvailability(adate, status, idvenue) 
tblVenue(id) 

最後可能是不需要的,因爲venue.id可能是聲明爲一個主鍵。

+0

太好了。謝謝。也感謝你的整潔的例子。我會檢查並從您的建議格式/佈局學習。我想我是以一種凌亂的方式教/學的。 :) 我確實有你想象中的第三個索引,但其他兩個幫助加快了速度。 現在我已經意識到,它只是提出了當天的第一場會議,我已經通過給a.totalslots添加了總和來挑選出總分。只需要弄清楚如何在子查詢中對bslot進行求和。 – Charlie