mySQL快速導入大量數據的方法

來源:本站原創 mysql_mariadb 超過334 views圍觀 0條評論
SELECT INTO OUTFILE

> help select;
Name: 'SELECT'
Description:
Syntax:
SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [MAX_STATEMENT_TIME = N]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
      [PARTITION partition_list]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

舉例:

> select * from e;
+------+-------+-------+
| id   | fname | lname |
+------+-------+-------+
| 1669 | Jim   | Smith |
|  337 | Mary  | Jones |
| 2005 | Linda | Black |
+------+-------+-------+

> select * from e into outfile "/data/mysql/e.sql";
或 > select * into outfile "/data/mysql/e.sql" from e; # cat e.sql 1669 Jim Smith 337 Mary Jones 2005 Linda Black

可以看到,select…into outfile 的結果只包含了表數據,默認以 Tab 分隔,也可指定分隔符:

> select * from e into outfile "/data/mysql/e.sql" fields terminated by ',';
# cat  e.sql    
1669,Jim,Smith
337,Mary,Jones
2005,Linda,Black

注意:outfile ‘/path/file’,中的 path 需要有mysql的權限,否則會報錯:

> select * from t into outfile "/root/backup/mysql/t.sql";
ERROR 1 (HY000): Can't create/write to file '/root/backup/mysql/t.sql' (Errcode: 13 - Permission denied)
 
 
LOAD DATA INFILE

LOAD DATA INFILE 語句以非常高的速度從文本文件中讀取行到表中。

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name,...)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var,...)]
[SET col_name = expr,...]

舉例

> delete from e;
> load data infile "/data/mysql/e.sql" into table e fields terminated by ','; Query OK, 3 rows affected (0.01 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 > select * from e; +------+-------+-------+ | id | fname | lname | +------+-------+-------+ | 1669 | Jim | Smith | | 337 | Mary | Jones | | 2005 | Linda | Black | +------+-------+-------+

因為我們前面指定的分隔符是 ‘,’,load data 時也要指定分隔符,否則也會報錯:

> load data infile "/data/mysql/e.sql" into table e;
ERROR 1265 (01000): Data truncated for column 'id' at row 1

如果數據被某種符號封閉著,需要指定 ‘ fields enclosed by ’ :

# cat e.sql 
"1669"  "Jim"   "Smith"

 > load data infile “/data/mysql/e.sql” into table e;
 ERROR 1366 (HY000): Incorrect integer value: ‘”1669″‘ for column ‘id’ at row 1


 > load data infile “/data/mysql/e.sql” into table e fields enclosed by ‘”‘;
 Query OK, 1 row affected (0.01 sec)
 Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

如上所示,數據被雙引號封閉著,如果直接執行,會報錯。

另外還有一些格式上的限制,如 LINES TERMINATED BY ‘string’ ,指定 file 的換行符,如 ‘\n’ 。

 

 

mysqlimport

mysql 命令中有 load data ,mysql還有一個可執行文件 mysqlimport,這兩個命令可以從文件中把格式化的數據導入數據庫,如果有一個包含大數據量的文件,可以實現快速的數據導入。

mysqlimport 可以看做是為 LOAD DATA INFILE SQL語句提供了一個命令行界面,他們大部分的參數選項是一致的,由 SELECT into outfile 導出的文件,也可以由 mysqlimport 導入。

mysqlimport 需要的文件格式與 load data 差不多,有興趣的同學可以去研究一下。這里給出它的基本語法:

mysqlimport -u root -pPassword [--local] dbname filename.txt [OPTION]

其中,“Password”參數是root用戶的密碼,必須與-p選項緊挨著;“–local”是在本地計算機中查找文本文件時使用的(指定 –local 后,文本文件可以放在任何地方進行導入,否則只能放在mysql的data目錄下);“dbname”參數表示數據庫的名稱;“filename.txt”參數指定了文本文件的路徑和稱,文件里的數據插入到文件名去掉后綴后剩余名字對應的表中;“OPTION”為可選參數選項,其常見的取值有:

–fields-terminated-by=字符串:設置字符串為字段之間的分隔符,可以為單個或多個字符。默認值為制表符“\t”。

–fields-enclosed-by=字符:設置字符來括住字段的值,只能為單個字符。

–fields-optionally-enclosed-by=字符:設置字符括住CHAR、VARCHAR和TEXT等字符型字段,只能為單個字符。

–fields-escaped-by=字符:設置轉義字符,默認值為反斜線“\”。

–lines-terminated-by=字符串:設置每行數據結尾的字符,可以為單個或多個字符,默認值為“\n”。

–ignore-lines=n:表示可以忽略前n行。

文章出自:CCIE那點事 http://www.qdxgqk.live/ 版權所有。本站文章除注明出處外,皆為作者原創文章,可自由引用,但請注明來源。 禁止全文轉載。
本文鏈接:http://www.qdxgqk.live/?p=3938轉載請注明轉自CCIE那點事
如果喜歡:點此訂閱本站
  • 相關文章
  • 為您推薦
  • 各種觀點
?
暫時還木有人評論,坐等沙發!
發表評論

您必須 [ 登錄 ] 才能發表留言!

?
?
萌宠夺宝游戏