JOIN的奇怪行为

时间:2010-10-10 19:02:39

标签: sql mysql optimization join

我的查询试图加入3个表时遇到一个奇怪的问题。表格描述了:

2个类似的表(entr_es):

Field   Type    Null    Key Default Extra  
espid   int(11) NO  PRI NULL    auto_increment 
haslo   text    NO  MUL NULL   
kat int(11) NO  NULL   

第二个表看起来是一样的,除了第一列whis被命名为polid。

第三个表是:

Field   Type    Null    Key Default Extra
polid   int(11) NO  PRI NULL
espid   int(11) NO  PRI NULL

以下是查询:

第一个:

SELECT entr_pl.haslo AS srchaslo, entr_es.haslo AS trghaslo
FROM entr_es, entr_pl, rel_pl_es
WHERE entr_pl.polid=rel_pl_es.polid
AND rel_pl_es.espid=entr_es.espid
AND entr_pl.haslo LIKE "%ludzk%"

快速工作,大约0.2秒。这对我来说已经足够了。

但是另一个,几乎相同,但反过来:

SELECT entr_es.haslo AS srchaslo, entr_pl.haslo AS trghaslo
FROM entr_es, entr_pl, rel_pl_es
WHERE entr_pl.polid=rel_pl_es.polid
AND rel_pl_es.espid=entr_es.espid
AND entr_es.haslo LIKE "%hum%"

工作不好 - 结果没问题,但查询需要大约2.2才能执行,我不知道为什么。我查看了EXPLAIN,但我发现唯一的问题是第二个查询,即慢速查询,是“使用临时”。我不知道为什么。我确信有一些我看不见的东西,也许还有一种简化这些查询的方法。

请提前帮助和非常感谢, 最好的问候,

卡米尔

=======

我非常抱歉 - 我再次经历了这个问题,而减速问题则在其他地方。

这是

ORDER BY srchaslo
每个查询结束时的

子句。我在第一篇文章中提出这个问题,认为它不相关,但确实如此。它在第一个查询中运行良好且快速,但在另一个查询上速度非常慢。我尝试添加COLLATE语句,然后添加不同的编码,但它不起作用。然后我尝试将此查询包装到SELECT * FROM(查询)AS t1中并将ORDER BY抛出(),但这不会起作用。查询和它一样慢。我没有任何想法如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

你需要一个关于rel_pl_es的额外索引:

create index idx2 on rel_pl_es( espid,polid);

对于第二个查询,现有索引不起作用。