愛伊米

還在糾結嗎?解析對比MySQL中LOAD DATA INFILE語句和INSERT語句你應該選擇哪個

編譯:馮瀟霄

這篇文章向我們展示了LOAD DATA INFILE語句與INSERT語句之間的差異,以及在MySQL中進行資料輸入的時候何時要同時使用二者。

還在糾結嗎?解析對比MySQL中LOAD DATA INFILE語句和INSERT語句你應該選擇哪個

引言

如果您已經使用MySQL工作了一段時間,那麼您可能已經知曉MySQL為資料輸入提供了多種方式,其中之一就是INSERT INTO語句。它基本上被當作資料輸入的標準方式。然而,MySQL還有輸入轉儲資料的另一種方式,那就是LOAD DATA INFILE語句。如果我們在資料庫例項中要處理大量資料,這種語句就會派上用場了。但是當我們要在INSERT INTO語句和LOAD DATA INFILE語句這二者間做選擇的時候,我們可能就不確定選擇哪種更好——這就是今天我們想要研究的內容。

插入資料‍

首先,INSERT語句正如其名,我們可以使用它在表格中插入資料。這個語句最基本的形式看起來是這樣的:

INSERT INTO demo_table (column_1) VALUES (‘Demo Data’);

如你所見,這個語句由幾個部分組成:

1。 INSERT INTO語句告訴MySQL我們想要對資料執行INSERT功能,而不是想要SELECT、刪除或是更新它們。

2。 demo_table是我們想要向其中插入資料的表格的名稱。

3。 column_1指的是我們想要向其中插入資料的列的名稱。

4。 VALUES特指在這個引數之後將要設定的值。

5。 ‘Demo Data’在 column_1列中插入帶有文字‘Demo Data’的行。

插入示例

在我們執行這個SQL語句之後,一些演示資料將會被新增到我們的表格中。我們也可以像這樣執行INSERT語句:

INSERT INTO arctype (column, column_2) VALUES (‘Demo’, ‘Demo 2’);

在這個示例中,值Demo會被插入到列column中,另一個值Demo 2將會被插入到另一個列column_2中。

也請記住當我們向表格中的每一列新增值的時候,我們不需要指定列:

INSERT INTO arctype VALUES (‘Demo’, Demo 2‘);

這個語句會和上面的示例一樣執行。

另外,我們也可以使用一次插入多個行的功能,查詢語言如下所示:

INSERT INTO arctype (demo_1, demo_2) VALUES (’Demo Data‘, ’Demo 2‘),(’Demo Data Again‘, ’Data123‘),(’Data here‘, ’Data here too‘);

這個語句同樣也可以無誤執行!這樣做的好處是,我們還減少了對資料庫本身的呼叫。

INSERT語句無效的情況

然而,在使用INSERT查詢時也有一些需要提醒的事項:插入演示表中的資料必須要和表中設定的列中的資料型別一致。這是什麼意思呢,舉個例子,我們可能會像這樣執行一個查詢:

INSERT INTO arctype (number_column) values (’Demo‘);

其中 number_column是INT函式的型別,這種情況下MySQL則不能執行這個查詢,它會返回一個像這樣的錯誤指令:

#1366 - Incorrect integer value: ’Demo‘ for column ’number_column‘ at row 1

這個錯誤很一目瞭然:列接受了數字而不是文字值:我們給MySQL輸入了它不喜歡的其他東西。

輸入大量資料

將資料插入到你的MySQL中會讓你走得更遠。同樣地,在你作為MySQL資料庫管理員的職業生涯的某個時刻,你可能需要了解INSERT語句,從而向你的資料庫例項中輸入極大量的資料(由10萬行或以上組成的資料)。幾個以大資料為基礎的專案就能夠利用INSERT語句的這個特點。例如,你知道世界上重大的搜尋引擎資料外洩之一就是在MySQL上嗎?為了完全理解這個語句,我們必須瞭解我們的選擇。

使用

LOAD DATA INFILE

語句

為了向MySQL中輸入大量資料,我們可以使用技巧插入多個行(上文有概述)或者也可以使用LOAD DATA INFILE語句。LOAD DATA INFILE語句也正如其名,把資料從一個檔案載入另一個表格中。LOAD DATA INFILE語句查詢的基本句法看起來是這樣的:

LOAD DATA INFILE ’/path/to/file。csv‘ INTO TABLE demo_table;

這個句法中/path/to/file。csv描述的是我們想要移出資料的檔案路徑,demo_table代表表格的名稱。

語句也有其他指定的選擇。例如,我們也能夠在語句末指定我們想要把資料載入到哪列中:

LOAD DATA INFILE ’/path/to/file。csv‘ INTO TABLE demo_table (demo_column);

什麼是

IGNORE

語句

?

上文中提到的語句只能把資料插入一個叫 demo_column的列中。如果人們想的話,我們也可以指定一個IGNORE語句關鍵詞。

LOAD DATA INFILE ’/path/to/file。csv‘ IGNORE INTO TABLE demo_table;

這個語句會忽略它遇到的所有錯誤,不管怎樣都會載入資料。IGNORE語句也可以和特定的列相結合。

LOAD DATA INFILE ’/path/to/file。csv‘ IGNORE INTO TABLE demo_table (demo_column);

一個原因使這個語句非常有效:如果我們指定的資料組非常龐大,但是我們甚至都不需要它其中一半的資訊(也就是說,我們只需要第一列的值,而不是第二、第三列的等等),這個語句就會很便捷地“忘記”將資料載入那些列中,也會忽略在這個過程中MySQL可能會遇到的錯誤。這樣就能節省時間。

同樣地,請記住LOAD DATA INFILE語句也有定位的功能,這意味著你也能迅速執行一個類似LOAD LOCAL DATA INFILE的查詢:那個語句也會有效。LOCAL語句可以將資料儲存的位置改變到MySQL希望儲存的位置:如果LOCAL語句能夠使用,MySQL就可以把資料儲存在客戶主機上的任意位置;否則,資料就只能被儲存在伺服器主機上。

為什麼LOAD DATA INFILE語句如此迅速

用MySQL工作的時候,比較下MySQL中INSERT INTO語句和LOAD DATA INFILE語句的輸入時間,你可能就會發現LOAD DATA INFILE 語句用資料庫的方式載入資料,這種方式遠比INSERT語句執行快得多。原因很簡單:LOAD DATA INFILE語句比INSERT語句干擾MySQL少:例如, LOAD DATA INFILE語句能夠跳過行、列,或者如果我們希望的話,可以只載入指定的列,跳過所有其他的(在上述示例中提到過)。INSERT語句就不具備這種特點;雖然它可以一次輕鬆插入多個行,它卻不具備更廣泛地處理資料組的功能,也就是說,它無法處理有一百萬行的資料。

然而這並不是說LOAD DATA INFILE語句就沒有缺點了;例如,用LOAD DATA INFILE語句處理有一百萬行或是更多的資料,你就會發現執行一段時間之後,它的速度就會減緩:為了避免這種狀況的發生,你可能想把你用來向資料庫載入資料的檔案拆開,相比於一次載入100或200萬行資料,用更小的組塊載入資料:比如說,你有10個檔案,每個都有1000萬行,用迴圈指令讓你的 LOAD DATA INFILE語句依次執行它們。你就成功了!

修改資料

如果你經常用MySQL插入資料,很大可能你正在使用編輯器。像Arctype這樣的SQL編輯器可以讓你輕鬆建立編輯表格。你也可以用它和你的團隊分享查詢語句——所有都可以非常快速的執行。例如,以下是Arctype編輯器執行時處理表格的過程中可能顯示的樣子:

而它的功能遠遠不止如此!如果你想,你也可以編輯約束條件或者外部鍵:所有功能都不需要擔心執行的查詢語句會修改你的資料。

還在糾結嗎?解析對比MySQL中LOAD DATA INFILE語句和INSERT語句你應該選擇哪個