2013-06-30 82 views
1

我無法索引該左連接:MySQL - 如何索引這個左連接?

SELECT comments.id, comments.topid, comments.username, comments.body, comments.dt, comments.active, users.email 
FROM comments 
LEFT JOIN registered_users.users 
ON comments.username = users.username 
WHERE postid = 12 AND active = 1 
ORDER BY id desc 

我有指標:

評論 - >鍵名(帖子ID) - 帖子ID,活動,ID

用戶 - >鍵名(用戶名) - 用戶名

結果我找回的是:

+----+-------------+----------+------+---------------+--------+---------+-------------+------+---------------------------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref   | rows | Extra       | 
+----+-------------+----------+------+---------------+--------+---------+-------------+------+---------------------------------+ 
| 1 | SIMPLE  | comments | ref | postid  | postid | 5  | const,const | 116 | Using temporary; Using filesort | 
| 1 | SIMPLE  | users | ALL | NULL   | NULL | NULL | NULL  | 1 |         | 
+----+-------------+----------+------+---------------+--------+---------+-------------+------+---------------------------------+ 

我該如何解決這個問題,以免我「臨時使用;使用文件排序」?

+0

但它使用的是索引。表現不好嗎? – Bohemian

+0

現在的表現還算馬馬虎虎,但是我有一種感覺,因爲網站接收到更多的流量,這將是一個問題 –

回答

0

也許使所有三列

comments指數是一個InnoDB表

ALTER TABLE comments ADD INDEX new_index (active,postid,username); 

comments是MyISAM表

ALTER TABLE comments ADD INDEX new_index (active,postid,id,username); 

爲什麼提出一個新的指數?

正在搜索comments表由postid索引仍然需要間歇性地訪問表以檢查id和用戶名列。索引內的WHEREORDER BY子句中的更多列將減輕Optimizer的工作量。

CAVEAT

即使retrieveal是快一點,因爲你說

ORDER BY id desc 

試試看的文件排序是不可避免的!

+0

我仍然收到相同的結果:使用臨時;使用filesort –

+0

刪除「ORDER BY id desc」解決了問題。現在,只需要弄清楚如何以相反的順序得到結果。 –

+0

這個+使用「array_reverse()」解決了我的問題。 –

0

如果active是一個標誌,那麼優化器可能沒有足夠的選擇性來打擾它。你有沒有試過在postid上只有索引?

+0

是的,我得到了同樣的結果 –

0

經驗告訴我這樣做:

create index comments_postid on comments(postid); 

而且你需要將其他指數是users(username)但你已經有了。

這是一個好主意,這樣做太:

analyze table comments, users; 
1

如果任何人有這個問題,始終確保你的連接表被設置爲相同的排序規則類型。

我的評論表被設置爲「utf8_unicode_ci」 - 當我試圖加入到設置爲「latin1_swedish_ci」的users.email。

如果設置不同,MySQL不能使用任何索引。

我現在可以使用ORDER BY,LIMIT子句而沒有可怕的「filesort」問題。