查询效果:按邮政编码,公司名称或城镇搜索

时间:2011-09-30 10:48:38

标签: mysql sql database

请参阅下面的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查询。

3 个答案:

答案 0 :(得分: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'Liverpool'。使用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'

如果您使用后者并创建索引,那么您的查询应该运行得很好!

答案 1 :(得分:0)

使用IFNULL代替OR可能会带来显着的性能提升,具体取决于您的数据量,索引等。

答案 2 :(得分:0)

  1. 摆脱空字符串的条件(S_D.postcode = '' OR S.company LIKE ''
  2. 一般情况下,LIKE会慢慢减慢您的查询速度,所以只要可能,我就会避免这样做
  3. 在WHERE列上添加索引