2010-10-10 31 views
1

我嘗試加入3個表的查詢有一個奇怪的問題。 descibed的表:JOIN的奇怪行爲

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%" 

工作壞 - 結果是OK,但查詢需要大約2.2到執行,我不知道爲什麼。我查看了解釋,但我發現的唯一的事情是,第二個查詢,即慢速查詢,是「使用臨時」。我不知道爲什麼。我確定有一些顯而易見的東西我看不到,也許還有一種方法可以簡化這些查詢。

請幫忙提前十分感謝, 最好的問候,

卡米爾

=======

實在對不起 - 我去throught它再次和減速問題在別處。

這是對每個查詢的末尾

ORDER BY srchaslo 

條款。我在第一篇文章中忽略了它,認爲它不相關,但它是。它在第一個查詢中工作正常,速度很快,但在另一個查詢中速度很慢。我試圖添加COLLATE語句,然後是不同的編碼,但它不起作用。然後我試圖將這個查詢包裝到SELECT * FROM(query)AS t1中,並將ORDER BY放在()之外,但這不會起作用。查詢速度如此緩慢。我沒有任何想法如何解決這個問題。

回答

2

你需要rel_pl_es額外指數:

create index idx2 on rel_pl_es(espid,polid); 

對於第二個查詢,現有的索引不起作用。

+0

就是這樣!它完美的工作!你是如何發現它的? – Basakatu 2010-10-10 22:34:22

+0

無論如何,感謝您的熱心幫助和時間來解決我的問題。感謝列文也。你們都很棒! – Basakatu 2010-10-10 22:36:43

+0

我以前有過類似的問題。我很高興它爲你工作。 – Martin 2010-10-11 06:15:02