2011-09-30 37 views
0

查看下面的SQL查詢 - 它允許您通過郵政編碼,公司名稱或城鎮(位置)搜索商店...在前端網站上將只有一個搜索沒有下拉搜索類型的文本框。查詢表現:按郵政編碼,公司名稱或城鎮搜索

如果shop_options.live等於1,並且取決於哪一天開店:O_Hour.weekday = '5'(星期五),它將只顯示結果。

如果我通過S_D.postcode(例如:S_D.postcode = 'L14')搜索,它會從shop_delivery_area表中找到L14,然後顯示該郵編的商店列表。

SELECT distinct S.*, S.company, S.street, S.town FROM shop as S 
    JOIN shop_delivery_area as S_D on S_D.shopID = S.shopID 
    JOIN shop_options on shop_options.shopID = S.shopID 
    JOIN shop_opening_hours as O_Hour on O_Hour.shopID = S.shopID 
WHERE (S_D.postcode = 'Liverpool' OR S.company LIKE 'Liverpool' OR S.town LIKE 'Liverpool') 
AND shop_options.live = '1' AND O_Hour.weekday = '5' 
    ORDER BY O_Hour.opentime 

查詢確實有效,但速度很慢。幾乎一秒鐘才能得到結果。如何更快地提高性能?

編輯:固定SQL查詢。

+0

你有多少數據?指標? – michael667

+0

shop(1,200),shop_delivery_area(5000),shop_options(1200),shop_opening_hours(8000)rows ...我沒有編制索引 –

+1

您是否已經使用EXPLAIN? http://dev.mysql.com/doc/refman/5.0/en/explain.html索引可能也會有所幫助,因爲您已經在所有表格中都有ID列 – michael667

回答

1

如果您需要保留謂詞,即

S_D.postcode = 'Liverpool' OR S.company LIKE 'Liverpool' OR S.town LIKE 'Liverpool' 

然後考慮在相同列上添加索引。所以:

ALTER TABLE shop_delivery_area ADD KEY `sda_idx1` (`postcode`); 
ALTER TABLE shop ADD KEY `shop_idx1` (`company`); 
ALTER TABLE shop ADD KEY `shop_idx2` (`town`); 

另一個問題是關於模糊搜索。如果你可以用'='替換'LIKE',那麼你會看到速度增加。使用'LIKE'沒有太大意義,但沒有模糊搜索,即LIKE'利物浦'。使用LIKE'%Liverpool%'或='Liverpool'。因此,無論使用:

S_D.postcode = 'Liverpool' OR S.company LIKE '%Liverpool%' OR S.town LIKE '%Liverpool%' 

S_D.postcode = 'Liverpool' OR S.company = 'Liverpool' OR S.town = 'Liverpool' 

如果使用後者,並創建索引,然後查詢應該運行得很好!

0

使用的IFNULL代替OR可以提供顯着的性能提升,這取決於你的數據,索引量等

0
  1. 獲取空字符串(S_D.postcode = '' OR S.company LIKE ''
  2. 一般都喜歡將擺脫的條件減慢你的查詢很多,所以我會盡可能避免它
  3. 在WHERE列添加索引
+0

但是,如何讓客戶通過郵編,公司名稱進行搜索或城鎮?將只有一個搜索文本框。 –

+0

我已更新SQL查詢,請查看我的意思。 –

+0

您必須根據應用程序代碼中的用戶輸入準備查詢。如果用戶只填寫鎮和其他文本框是空的 - 只查詢鎮的條件。如果所有的文本框都是空的 - 無條件地查詢(而不是S_D.postcode =''或S.company LIKE'或S.town LIKE'') – matino