有没有办法优化这个mysql查询?

有没有办法优化这个mysql查询?,sql,mysql,query-optimization,Sql,Mysql,Query Optimization,T1有150000个,T2有15000个。(静态表!) 我对这个表的“name”有索引 有没有办法优化这个mysql查询? 我还想做->像“%term1%”,但速度非常慢。提高性能的一种方法是在这些表的名称列上放置全文索引。第一步是使用ANSI-92重新编写查询: 之后,请看索引: 名字酒店 城市迪德酒店 城市名称 城市id …在各种组合中。是的,只需在hotel和city之间直接连接,并将两个LIKE语句移动到WHERE子句 如果您可以更改表结构,并且如果名称重复很多,则可以将名称规范化为

T1有150000个,T2有15000个。(静态表!) 我对这个表的“name”有索引

有没有办法优化这个mysql查询?
我还想做->像“%term1%”,但速度非常慢。

提高性能的一种方法是在这些表的名称列上放置全文索引。

第一步是使用ANSI-92重新编写查询:

之后,请看索引:

  • 名字酒店
  • 城市迪德酒店
  • 城市名称
  • 城市id

…在各种组合中。

是的,只需在hotel和city之间直接连接,并将两个LIKE语句移动到WHERE子句

如果您可以更改表结构,并且如果名称重复很多,则可以将名称规范化为键,并在较小的表中搜索与名称匹配的键,然后根据名称的键查找数据

还根据“OMG小马”答案添加索引

我还想做->像“%term1%”,但速度非常慢

也许像“$term%”这样的
名称或像“$reverse\u term%”这样的反向名称比像“%$term%”这样的
名称快
。当然要有适当的创意


我从来没有试过。。。我突然想到了。

然后他们发明了这个概念。这很好。需要注意的是,如果使用MySQL全文搜索,MySQL要求表是MyISAM。OR的性能非常差。像
一样对
的左侧进行通配符可以确保无法使用列上的索引。有没有方法可以更快地执行此操作?因为%term%需要几秒钟才能执行。@OMG Ponies:这就是为什么我建议不要对左侧进行通配符,而是对右侧(反向字符串)进行通配符。我的查询就是JOIN。但我有单独的索引。我指的是每列的索引,你所说的“在各种组合中”是什么意思?我在4个索引中的每一个添加了3个其他索引。现在,它已经得到了极大的改善!非常感谢@Ben:索引可以用于单个列,但大多数数据库支持复合索引,它可以包含多个列。但是复合索引有一个缺点——列的顺序很重要,它们是从左到右处理的。
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
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%'