2017-04-08 140 views
0

任何人都可以幫助我提高查詢效率嗎? 我是SQL的初學者, ,據我所知有效率是使用索引或主鍵讓B樹搜索更快,因此,我已經設置了主鍵rid和索引(Date, Time) 但是,我的查詢仍然效率太低,無法輸出結果。任何人都可以幫助我提高查詢效率嗎?

我試圖找到'2017-03-04'上間隔最大的傳感器(sid)。 這裏是我的代碼:

select tmp4.sid as largest_ivl_sensor 
from 
(
    select tmp3.sid, MAX(tmp3.Dif) as max_for_each 
    from 
    (
     select tmp1.sid, MIN(TIME_TO_SEC(DATE_SUB(tmp2.Time, INTERVAL tmp1.Time HOUR_SECOND))) as Dif 
     from 
      (
      select se.sid, r.rid, r.Time 
      from (select rr.rid, rr.Time from records rr where rr.Date = '2017-03-04') as r, send se 
      where se.rid = r.rid 
      order by se.sid 
      ) as tmp1 
      INNER JOIN 
      (
      select se2.sid, r2.rid, r2.Time 
      from (select rr2.rid, rr2.Time from records rr2 where rr2.Date = '2017-03-04') as r2, send se2 
      where se2.rid = r2.rid 
      order by se2.sid 
      ) as tmp2 ON tmp1.sid = tmp2.sid and TIME_TO_SEC(tmp1.Time) <= TIME_TO_SEC(tmp2.Time) and tmp1.rid <> tmp2.rid 
     GROUP BY tmp1.sid, tmp1.Time 
    ) as tmp3 
    GROUP BY tmp3.sid 
) as tmp4 
group by tmp4.max_for_each 
having tmp4.max_for_each = MAX(tmp4.max_for_each); 

這裏是架構: 記錄

+-------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+-------------+-------------+------+-----+---------+-------+ 
| rid   | int(11)  | NO | PRI | NULL |  | 
| Date  | date  | YES | MUL | NULL |  | 
| Time  | time  | YES |  | NULL |  | 
| Humidity | double(5,2) | YES |  | NULL |  | 
| Temperature | double(5,2) | YES |  | NULL |  | 
| PM1   | int(11)  | YES |  | NULL |  | 
| PM10  | int(11)  | YES |  | NULL |  | 
| PM25  | int(11)  | YES |  | NULL |  | 
+-------------+-------------+------+-----+---------+-------+ 

發送

+-------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+-------+-------------+------+-----+---------+-------+ 
| sid | varchar(30) | NO |  | NULL |  | 
| rid | int(11)  | NO | PRI | NULL |  | 
+-------+-------------+------+-----+---------+-------+ 

下面是一個例子:

| rid |sid | Time | 
| 1 | a | 00:00:00 | 
| 2 | a | 00:01:00 | 
| 3 | b | 00:05:00 | 
| 4 | b | 00:07:00 | 
| 5 | b | 00:11:00 | 
| 6 | c | 00:00:00 | 
| 7 | c | 00:03:00 | 
| 8 | c | 00:04:00 | 

慾望d結果:

| sid| 
| b| 

因爲它有最大間隔4分鐘

又如:

| rid |sid | Time | 
| 1 | a | 00:00:00 | 
| 2 | b | 00:11:00 | 
| 3 | c | 00:04:00 | 
| 4 | b | 00:07:00 | 
| 5 | a | 00:01:00 | 
| 6 | c | 00:00:00 | 
| 7 | c | 00:03:00 | 
| 8 | b | 00:05:00 | 

謝謝你幫助我。

+0

編輯您的問題並提供(1)樣本數據; (2)期望的結果; (3)解釋它在做什麼。從性能開始的地方是理解需要做什麼。 –

+0

我猜測最大的區間意味着每天的某種連續區間。在這種情況下,請查看mysql中每組的rownumber。 – Mihai

回答

0

您可以利用SQL中的變量來跟蹤即時差異。此外,order by結合limit 1是非常方便的獲取記錄最高值:

select  sid, 
      max(diff) as max_diff 
from  (
       select  if(sid = @s, secs - @t, null) as diff, 
          @t := secs as secs, 
          @s := sid as sid 
       from  (select  sid, 
             time_to_sec(time) as secs 
          from  records 
          inner join send on send.rid = records.rid 
          where  date = '2017-03-04' 
          order by sid, time 
          ) ordered 
       cross join (select @s := null, @t := null) init 
      ) data 
group by sid 
order by max_diff desc 
limit 1; 

看到它在rextester.com運行。

+0

對不起,也許我沒有解釋清楚我的例子。 'rid'是每個記錄(行)的id,當創建表'records'時它被設置爲auto_increment。 –

+0

問題是什麼? – trincot

+0

也許這個例子就像 | rid | sid |時間| | 1 | a | 00:00:00 | | 2 | a | 00:01:00 | | 3 | b | 00:05:00 | | 4 | b | 00:07:00 | | 5 | b | 00:11:00 | | 6 | c | 00:00:00 | | 7 | c | 00:03:00 | | 8 | c | 00:04:00 | –

相關問題