2013-01-23 51 views
0

我目前將數據插入表中與的MyISAM發動機,的MySQL,LOAD DATA並行本地,禁用與使鍵

我希望通過建立LOAD DATA完成後的索引(預先禁用鍵和使得能夠優化LOAD DATA他們完成後)。

LOAD DATA CONCURRENT文檔中,加載數據應該將記錄添加到表的末尾,同時我感興趣的是一個併發讀取到同一個表將繼續使用鍵。我保證讀取操作將嘗試從表中讀取信息,直到 最後一個可用索引(自動遞增的ID)在LOAD DATA CONCURRENT開始之前。

例如

LOAD DATA CONCURRENT將增加從指數100000開始的數據,並自動遞增,直到指數200000

在同一時間,可能會發生SELECT * FROM TableName WHERE id <=99999 AND ...聲明。

是否可以僅在本地僅對LOAD DATA CONCURRENT語句禁用密鑰,以便讀取操作仍將使用其SELECT語句中定義的索引?

回答

1

我假設1.您的id列是主鍵,並且2.您打算使用ALTER TABLE ... DISABLE KEYS

根據the manual

ALTER TABLE ... DISABLE KEYS讓MySQL停止更新非唯一索引。 (...)儘管非唯一索引被禁用,但對於像SELECT和EXPLAIN這樣的語句,它們會被忽略,否則會使用它們。

因此,主鍵仍然可以用於形式

SELECT * FROM TableName WHERE id <=99999 

的查詢然而,不可能僅一個表的子集禁用鍵。

+0

+1,我所有的鍵都只是鍵,我沒有任何主鍵(它們只是索引),它們也會用於選擇嗎?以及如何檢查這是確定的? – Michael

+0

@Michael Hum,表格應該總是有一個主鍵。如果索引是非唯一的(既不是'PRIMARY KEY'也不是'UNIQUE'索引,而是一個普通的INDEX),那麼它們將被禁用。 – RandomSeed

+0

好的,比我看到沒有別的辦法,這也是一個答案。順便說一句,表應該總是有一個主鍵是錯的!,有理由不能有一個主鍵作爲範圍分區的情況下,以及更多的其他原因... – Michael