SELECT T1.name AS hotel,
T2.name AS city
FROM (SELECT *
FROM hotel
WHERE name LIKE '$term1%') T1,
(SELECT *
FROM city
WHERE name LIKE '$term2%') T2
WHERE T1.city_id = T2.id
T1有150000,T2有15000.(静态表!) 我在这个表的'name'上有索引。
有一种方法可以优化这个mysql查询吗? 我也想做 - >像'%term1%',但它非常慢。
答案 0 :(得分:7)
第一步是使用ANSI-92 JOIN syntax重新编写查询:
SELECT h.name AS hotel,
c.name AS city
FROM HOTEL h
JOIN CITY c ON c.id = h.city_id
WHERE h.name LIKE '$term1%'
AND c.name LIKE '$term2%'
之后,看看索引:
......各种组合。
答案 1 :(得分:1)
是的,只需直接在酒店和城市之间加入,并将两个LIKE语句移到WHERE子句中。
如果您可以更改表结构,并且如果存在大量重复名称,您可以将名称标准化为键,并在较小的表中搜索与名称匹配的键,然后根据名称的键查找数据。
同时根据“OMG小马”答案添加索引。
答案 2 :(得分:0)
提高性能的一种方法是在这些表的名称列上放置全文索引。
答案 3 :(得分:0)
我也想做 - >喜欢'%term1%'但非常慢
可能name LIKE '$term%' OR reverse_name LIKE '$reverse_term%'
比name LIKE '%$term%'
快。当然有适当的目标。
我从未尝试过......只是突然出现在我的脑海里。