查询表现:按邮政编码,公司名称或城镇搜索
查看下面的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查询。
如果您需要保留谓词,即
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'
如果使用后者,并创建索引,然后查询应该运行得很好!
- 获取空字符串(
S_D.postcode = '' OR S.company LIKE ''
) - 一般都喜欢将摆脱的条件减慢你的查询很多,所以我会尽可能避免它
- 在WHERE列添加索引
但是,如何让客户通过邮编,公司名称进行搜索或城镇?将只有一个搜索文本框。 –
我已更新SQL查询,请查看我的意思。 –
您必须根据应用程序代码中的用户输入准备查询。如果用户只填写镇和其他文本框是空的 - 只查询镇的条件。如果所有的文本框都是空的 - 无条件地查询(而不是S_D.postcode =''或S.company LIKE'或S.town LIKE'') – matino
你有多少数据?指标? – michael667
shop(1,200),shop_delivery_area(5000),shop_options(1200),shop_opening_hours(8000)rows ...我没有编制索引 –
您是否已经使用EXPLAIN? http://dev.mysql.com/doc/refman/5.0/en/explain.html索引可能也会有所帮助,因为您已经在所有表格中都有ID列 – michael667