我有一個查詢,正在33秒的有沒有更好的方式來改寫它,我怎麼可以把它轉換到程序需要優化MySQL查詢
select ut.templateId,
(
case
when ut.reportTypeId=4 then 'Account'
when ut.reportTypeId=5 then 'Campaign'
when ut.reportTypeId=6 then 'AdGroup'
when ut.reportTypeId=7 then 'Ad'
when ut.reportTypeId=8 then 'Keyword'
end
)as ReportType ,
ur.reportId,
(case when timestampdiff(SECOND,b.createdTS,a.createdTS) < 5 then a.reportId else 0 end) as '<5secs',
(case when timestampdiff(SECOND,b.createdTS,a.createdTS) between 5 and 10 then a.reportId else 0 end) as '5-10secs',
(case when timestampdiff(SECOND,b.createdTS,a.createdTS) between 11 and 20 then a.reportId else 0 end) as '11-20secs',
(case when timestampdiff(SECOND,b.createdTS,a.createdTS) between 21 and 30 then a.reportId else 0 end) as '21-30secs',
(case when timestampdiff(SECOND,b.createdTS,a.createdTS) between 31 and 60 then a.reportId else 0 end) as '31-60secs',
(case when timestampdiff(SECOND,b.createdTS,a.createdTS) between 61 and 120 then a.reportId else 0 end) as '61-120secs',
(case when timestampdiff(SECOND,b.createdTS,a.createdTS) between 121 and 1800 then a.reportId else 0 end) as '2-30mins',
(case when timestampdiff(SECOND,b.createdTS,a.createdTS) > 1800 then a.reportId else 0 end) as '>30mins'
from
(select reportId,createdTS from T_ReportMonitor where status='EndSP')a,
(select reportId,createdTS from T_ReportMonitor where status='BeginSP')b,
(select templateId,reportTypeId,reportConsoleType from T_UserTemplate) ut,
(select reportId,templateId,createdTS,modifiedTS,isDeleted from T_UserReport) ur
where a.reportId=b.reportId
and date(ur.createdTS) = 20120731
and ut.templateId=ur.templateId
and reportConsoleType in ('Adser','APIAdser')
and ur.isDeleted=false
and a.reportId=ur.reportId
and ur.reportId!=313509 AND ur.reportId!=313510 AND ur.reportId!=313511 AND ur.reportId!=313512 AND ur.reportId!=313509 AND ur.reportId!=313510 AND ur.reportId!=313511 AND ur.reportId!=313512 AND ur.reportId!=313520;
查詢的解釋結果是
+----+-------------+-----------------+------+---------------+------+---------+------+--------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+------+---------------+------+---------+------+--------+--------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 20071 | |
| 1 | PRIMARY | <derived3> | ALL | NULL | NULL | NULL | NULL | 20072 | Using where; Using join buffer |
| 1 | PRIMARY | <derived5> | ALL | NULL | NULL | NULL | NULL | 148591 | Using where; Using join buffer |
| 1 | PRIMARY | <derived4> | ALL | NULL | NULL | NULL | NULL | 154030 | Using where; Using join buffer |
| 5 | DERIVED | T_UserReport | ALL | NULL | NULL | NULL | NULL | 124008 | |
| 4 | DERIVED | T_UserTemplate | ALL | NULL | NULL | NULL | NULL | 151745 | |
| 3 | DERIVED | T_ReportMonitor | ALL | NULL | NULL | NULL | NULL | 60849 | Using where |
| 2 | DERIVED | T_ReportMonitor | ALL | NULL | NULL | NULL | NULL | 60849 | Using where |
+----+-------------+-----------------+------+---------------+------+---------+------+--------+--------------------------------+
我對那些在使用的列密鑰的where子句和任何其他的比較,但他們都不是在查詢中使用,這是由於它們導出查詢的原因。
請與發佈數據的結構,使我們能夠做出優化的查詢使用http://sqlfiddle.com –
並解釋你想得到的結果 –
不要使用子查詢,而要使用連接。 – Nin