2016-11-23 42 views
0

此查詢從當前可靠的小表中返回幾千行的建議列表(提示)。但它返回的提示太慢而不是非常有用。其他大多數問題都表明向數據庫投票尋找放緩的地方。我真的沒有必要做到這一點。它目前看起來像下面,也許有人可以幫助我看到一種我不知道的技術。我真的很想加快以下查詢。如何讓MySQL更高效地運行?

$stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid, 
           tactical, latitude, longitude, email, Lname 
     FROM NetLog 
     WHERE recordID IN (SELECT max(recordID) 
     FROM NetLog 
     WHERE callsign LIKE ? 
     AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD') 
     GROUP BY callsign)"); 

因此,它會拉出最新版本的recordID。 recordID是此表中的自動增量變量。如果我刪除第一個FROM和WHERE,則查詢執行速度會快得多。像這兒;

$stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid, tactical, latitude, 
              longitude, email, Lname, recordID 
     FROM NetLog 
     WHERE callsign LIKE ? 
     AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD') 
     GROUP BY callsign"); 

問題是不能保證這是最新的記錄。

我該如何加快退貨速度,並且仍然確定我正在爲此呼號獲取最新的recordID?

回答

2

除了與執行計劃驗證的實際操作,你可以嘗試的方法將數據以不同

你可以嘗試使用,而不是A項DINAMIC(臨時)表

$stmt = $db_found->prepare(" 
SELECT DISTINCT 
    callsign 
    , Fname 
    , ID 
    , grid 
    , tactical 
    , latitude 
    , longitude 
    , email 
    , Lname 
FROM NetLog 
INNER JOIN ( 
    SELECT max(recordID) as recordID 
    FROM NetLog 
    WHERE callsign LIKE ? 
    AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD') 
    GROUP BY callsign 
) t1 on t1.recordID = NetLog.recordID;"); 
+0

我喜歡這樣的聲音,但我遇到了讓語法工作的問題。我沒有確切地得到一個錯誤,但我可以在我的編輯器中看到,語法不會驗證。我應該用引號括起來(「),並以a結尾); ?? –

+0

@KeithDKaiser。obviusly這個必須用雙引號括起來(並以a結尾;答案已更新.. – scaisEdge

+0

我仍然得到這樣的錯誤:#1054 - 'on子句'中的未知列't1.recordID' –

0

將您的查詢限制爲1,並按ORDER BY recordID DESC LIMIT 1排序結果。這樣它不必返回整個表格內容。

+0

LIMIT不防止表掃描。你可以'LIMIT 1',MySQL仍然會掃描整個表。閱讀「LIMIT」的工作原理。 –

+0

是的,你是對的N.B.但它會優化查詢的結果。 –

0

如果你想優化一個查詢,它總是很好的explain它的計劃,以確定什麼是問題。我猜想,呼號領域缺乏索引。 您使用LIKE運算符,因此可能full text index是您想要使用的。 DISTINCT在此查詢中看起來沒有必要,因爲子查詢中已有GROUP BY