2011-09-30 66 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