2014-06-17 32 views
0

我的數據庫表的增長速度非常快(並將繼續),在這個時候我有一個問題,這個查詢(當然,其他人也是如此):MySQL的:優化查詢對抗巨大的表

select user_id from post where user_id not in (select id from user) 

我需要什麼是張貼表中的新id,並且沒有在用戶表中。

這裏的解釋:

> mysql> explain select user_id from post where user_id not in (select 
> id from user); 
> 

+----+--------------------+-------+-----------------+---------------+---------+---------+------+----------+-------------+ 
| id | select_type  | table | type   | possible_keys | key  | key_len | ref |rows  | Extra  | 
+----+--------------------+-------+-----------------+---------------+---------+---------+------+----------+-------------+ 
| 1 | PRIMARY   | post | ALL    | NULL   |NULL  | NULL | NULL | 16076920 | Using where | 
| 2 | DEPENDENT SUBQUERY | user | unique_subquery | PRIMARY  | PRIMARY | 8  | func |  1 | Using index | 
+----+--------------------+-------+-----------------+---------------+---------+---------+------+----------+-------------+ 

我已經試過這等過:

SELECT p.user_id FROM post p LEFT JOIN user u ON p.user_id=u.id WHERE u.id IS NULL; 

的解釋:

mysql> EXPLAIN SELECT p.user_id FROM post p LEFT JOIN user u ON p.user_id=u.id WHERE u.id IS NULL; 
+----+-------------+-------+--------+---------------+---------+---------+-----------------+----------+--------------------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref    | rows  | Extra        | 
+----+-------------+-------+--------+---------------+---------+---------+-----------------+----------+--------------------------------------+ 
| 1 | SIMPLE  | p  | ALL | NULL   | NULL | NULL | NULL   | 14323335 |          | 
| 1 | SIMPLE  | u  | eq_ref | PRIMARY  | PRIMARY | 8  | ghost.p.user_id |  1 | Using where; Using index; Not exists | 
+----+-------------+-------+--------+---------------+---------+---------+-----------------+----------+--------------------------------------+ 

兩個查詢還得看整個表後,它非常龐大: 發表數:16077899條目 用戶表:9657158條目

查詢需要幾分鐘(超過30分鐘)才能執行,任何提示?

謝謝!

+1

你的第二個查詢應該返回很多空行,因爲如果它爲空,u.id只會顯示出來。也許你想要p.user_id。它的運行速度與第一個查詢一樣慢嗎? –

+0

你可以添加表格嗎? – Kickstart

+0

約阿希姆,你是對的,我已經改變了第二個查詢。 – user3364621

回答

0

我認爲你應該做兩件事情......

  1. 請確保您有和後指數(USER_ID)
  2. 添加DISTINCT關鍵字查詢,像這樣:

    SELECT DISTINCT USER_ID FROM後 其中USER_ID NOT IN(SELECT ID FROM用戶)

查看新的解釋計劃。

+0

添加索引,這將需要一段時間...有14M行。 – user3364621

+0

您正在詢問優化...添加索引可能是值得的。要有耐心;) – Frazz

+0

我不認爲這個索引對這個查詢有幫助(對於桌子上的其他查詢可能會有幫助)。它仍然是連接中的主表(因此該表上沒有記錄正在搜索以匹配值),並且沒有任何內容會檢查該值以縮小查詢範圍。 – Kickstart

0

我不是數據庫的專家,但是你的第一個查詢解釋沒有在用戶標識上使用索引,你有任何建立在post表中user_id字段的索引嗎?如果不是僅僅創造那個。另外,您可以嘗試按/ distinct進行分組來過濾用戶,因爲第一個查詢將以其他方式返回多個用戶標識。這在所有的增加速度。

+0

將索引添加到表中。 – user3364621