2010-12-16 25 views
2

我有一個在MySQL的(MyISAM的)這個查詢:MySQL是阻止(或如何優化本)

SELECT * FROM `links` WHERE `id` IN (SELECT `link` FROM `posts` WHERE `read_time`<'2010-10-16') 

它似乎確定了我,但MySQL的它掛斷。 'links'是一個有16000行的表格,'posts'有大約5000行。 「ID」和「鏈接」是第一

我做了一些測試:除了一對情侶在每個表

  1. 刪除所有記錄。它的工作原理
  2. 執行內部查詢(SELECT link FROM posts WHERE read_time < '2010-10-16')第一和執行外部查詢(SELECT * FROM links WHERE id IN( '1232', '1354','3324 「))。它的工作原理
  3. 嘗試升級我的Ubuntu,但它說,這是最後的MySQL版本(5.1.37-1ubuntu5.5)

發生了什麼事?我發現了一個錯誤?或者我做錯了什麼?

+0

不,這不是一個錯誤。正如馬克·拜爾斯提到的那樣,一個「JOIN」會更好地工作。如果我沒有記錯的話,「IN」會比較所有內容,最終得出16k * 5k的比較結果。 – Bobby 2010-12-16 12:39:19

+0

發表你解釋計劃的答案將是不言而喻的 - 使用加入+索引 – 2010-12-16 12:39:33

回答

4

的MySQL目前不在優化這種形式的報表那麼好:

SELECT * 
FROM some_table 
WHERE x IN (subquery) 

這是MySQL's bug database,它應該被固定在MySQL 5.6和MySQL 6.0。 解決您的問題,您可以使用JOIN代替IN

SELECT links.* 
FROM links 
JOIN posts ON links.id = posts.link 
WHERE posts.read_time < '2010-10-16' 

你也應該嘗試read_time添加索引,如果你不已經有一個。

+1

實際上據我所知,它已被固定在5.4。將在我安裝5.5後檢查今天。 – Mchl 2010-12-16 12:56:22

0

除了標記Byers之外,如果可能的話,如果您尚未執行此操作,請在'read_time'上使用timestamp而不是datetime。