请参阅下面的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 :(得分: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)
S_D.postcode = '' OR S.company LIKE ''
)