2012-01-12 16 views
0

我有具有這些字段爲什麼在mysql中使用NOT IN語法會導致數據庫服務器崩潰?

表名稱的兩個MySQL表一個 - residential

ListingID varchar(12), 
ListingStatus varchar(15) 

ListingID主鍵和上ListingStatus的索引。

另一個表 - mlscheck

mls varchar(12), 
status varchar(15) 

與上狀態毫升和東印度相同的主鍵。

當我嘗試做任何事情,如:

delete from residential 
where ListingStatus = "Active" and 
ListingID NOT IN(select mls from mlscheck where status = "Active") 

即使是:

delete from residential 
where ListingStatus = "Active" 
    and LIstingID NOT IN(select mls from mlscheck) 

既不作品中,既有崩潰我的數據庫,我必須重新啓動。

我應該學習如何使用連接,聯合等?我認爲不是一個體面的命令。我可以從一些專家那裏獲得一些意見嗎?

+0

表中有多少條記錄? – 2012-01-12 01:20:49

+0

您是否嘗試過使用單引號(例如「Active」)?此外,作爲一般規則,除非95%唯一,否則不要對列進行索引。優化器將忽略索引,並且會產生不必要的開銷。 – 2012-01-12 01:27:00

+0

1.即使它很重,它也不會崩潰,這是數據庫。 2.也許你有其他內存/磁盤空間問題,檢查它,3.您檢查mysql日誌的BASIC OF BASICS? – 2012-01-12 01:47:16

回答

0

在性能上,連接總是更好或等於比子查詢

這個查詢是沉重的服務器,至極必須選擇mls所有的行,這對於在residential

每一行爲什麼數據庫崩潰。

通過聯接:

DELETE r FROM residential r 
LEFT JOIN mlscheck 
    ON mls = ListingID 
WHERE ListingStatus = "Active" 
    AND mls IS NULL 

只有residential行被刪除。 (即r)當找不到相應的行時mls

+0

當!你們這麼快,我可以;'t – retsman 2012-01-12 02:32:43

+0

對不起,忘記提到大約350個字段在住宅表170,000行rowlength 3,209和rowsize 3268 mlscheck表只有2個字段,總行數43,000左右。我從索引中刪除那些不是95%唯一的索引 – retsman 2012-01-12 05:16:36

0

對於大型記錄表,NOT IN操作符可能很昂貴。從您的餐桌名稱來看,您正在嘗試使用大型數據集的MLS列表進行操作。

你可以做的是寫一個腳本,由大塊不刪除塊:

從住宅刪去ListingStatus =「活動」和ListingID NOT IN(SELECT毫升從mlscheck其中狀態=「活性」 LIMIT 0,100)

從住宅刪除其中ListingStatus = 「活性」 和ListingID 其中ListingStatus = 「活動」 從 mlscheck和ListingID NOT IN(SELECT毫升,其中狀態= 「有效」 LIMIT 101,200)

從住宅刪去ListingStatus = 「活動」 和ListingID 其中ListingStatus = 「活動」 和ListingID NOT IN(從 mlscheck選擇毫升,其中狀態= 「活動」 LIMIT 201,300)

等。

這就是如果你不想使用BAK提到的JOIN方式。

+0

是的,住宅表中只有大約114,000條記錄,但有350個字段。我不知道索引被忽略,如果不是唯一的,謝謝。我可以得到一個聯合例子嗎?不妨加強對大男孩 – retsman 2012-01-12 02:28:52

+0

嘿傢伙,我覺得有點笨,我注意到,新創建的表mlscheck,是由瑞典拉丁somethiing或其他人的字符集創建的,我所有的其他表都是字符集utf8,現在一切都很好。但是我確實瞭解了開銷,並且我很感謝下次加入我的團隊。多謝你們 – retsman 2012-01-12 08:09:43

相關問題