2010-11-04 55 views
0

我在我的數據庫中有這個查詢,它基本上是從座標半徑10英里內拉出來的。SQL優化

SELECT id 
    FROM business 
WHERE (coordinates!='' 
    AND getDistance('-2.1032155,49.1801863', coordinates)<10) 
    AND id NOT IN ('6', '4118') ORDER BY rand() LIMIT 0,5 

當我資料這個查詢,我得到這個: 連接大小:3956(BAD) 使用臨時(BAD) USINGI文件排序(BAD)

你們能不能幫我優化這個查詢?

在此先感謝

回答

0

你總是需要文件排序「按訂單」的東西,不被索引(排序在臨時存儲器中所得到的數據),你(RAND())。

根據您的DBMS的優化功能,您最好使用「AND id!='6'和id!='4118'」而不是「NOT IN」子句。

您應該始終在查詢中聲明固定信息,儘管這也取決於查詢優化器的功能。此外,標準應與索引一致,意味着標準的出現順序應與您希望DMBS使用的索引中的順序相同。通常有一個選項來指定要使用哪個索引(關鍵字是「索引提示」),但大多數DMBS最好知道在大多數情況下使用的索引(從查詢本身猜測)。

而當您使用在查詢運行時(您的函數)生成的標準時,您永遠不會使用USING TEMPORARY。

+0

我總是使用IN()來檢查條件的子集。這是一個不好的練習嗎?例如,如果我想計算成員對他最喜歡的東西,我會這樣做:SELECT * FROM table WHERE member_id IN(1,2,3,4,5,6,7,8,... 2000) – gumpi 2010-11-04 14:50:38

+0

用一粒鹽來表達我的看法。這在很大程度上取決於特定DMBS的功能。如果查詢優化器很聰明,它可以輕鬆地將IN語句展開到相應的「field ='值'OR ...」語句中。但是我看到DBMS在這方面失敗了;並且函數會在每個記錄上向覆蓋層報告之前運行,這使查詢變慢。 – 0xCAFEBABE 2010-11-04 15:10:41