mysql加快插入

2021-06-20 19:50:27 字數 3355 閱讀 7186

在執行插入操作的sql:

insert into t1 (id,name) values (1,'name1' ),(2,'name2')...

需要匯入資料量很大,現在採用一次匯入10000條,迴圈匯入的方式解決。

請問下,一次性匯入多少條最優的,這個插入跟後面的條數有限制嗎?

這個跟一次插入多少條沒有關係,mysqsl預設的sql語句的最大限制是1m

下面給你提供一些快速插入的方法

1、如果同時從同乙個客戶端插入很多行,使用含多個value的insert語句同時插入幾行。這比使用單行insert語句快(在某些情況下快幾倍)。如果你正向乙個非空表新增資料,可以調節bulk_insert_buffer_size變數,使資料插入更快。參見5.3.3 節,「伺服器系統變數」。

2、如果你從不同的客戶端插入很多行,能通過insert delayed語句加快速度。參見13.2.4 節,「insert語法」。

3、用myisam,如果在表中沒有刪除的行,能在select語句正在執行的同時插入行。

4、當從乙個文字檔案裝載乙個表時,使用load data infile。這通常比使用很多insert語句快20倍。參見13.2.5 節,「load data infile語法」。

5、當表有很多索引時,有可能要多做些工作使得load data infile更快些。使用下列過程:

1). 有選擇地用create table建立表。

2). 執行flush tables語句或命令mysqladmin flush-tables。

3). 使用myisamchk --keys-used=0 -rq /path/to/db/tbl_name。這將從表中取消所有索引的使用。

4). 用load data infile把資料插入到表中,因為不更新任何索引,因此很快。

5). 如果只想在以後讀取表,使用myisampack壓縮它。參見15.1.3.3 節,「壓縮表特性」。

6). 用myisamchk -r -q /path/to/db/tbl_name重新建立索引。這將在寫入磁碟前在記憶體中建立索引樹,並且它更快,因為避免了大量磁碟搜尋。結果索引樹也被完美地平衡。

7). 執行flush tables語句或mysqladmin flush-tables命令。

6、鎖定表可以加速用多個語句執行的insert操作:

* lock tables a write;

* insert into a values (1,23),(2,34),(4,33);

* insert into a values (8,26),(6,29);

* unlock tables;

這樣效能會提高,因為索引快取區僅在所有insert語句完成後重新整理到磁碟上一次。一般有多少insert語句即有多少索引快取區重新整理。如果能用乙個語句插入所有的行,就不需要鎖定。

對於事務表,應使用begin和commit代替lock tables來加快插入。

不希望資料表中有重覆記錄的時候我們可以給表新增乙個聯合唯一索引

例如,user表中有user_id,user_name兩個字段,如果不希望有兩條一摸一樣的的user_id和user_name,我們可以給user表新增兩個欄位的聯合唯一索引:

alter table user add unique index(user_id,user_name);

這樣當向表中新增相同記錄的時候,會返回1062的新增失敗資訊。

但是有一種情況是表中已經有n個重複的記錄,這時候我們才想起來要新增唯一索引,再執行上面的操作時,資料庫會告訴你已經有重複的記錄了,建立索引失敗,這時候,我們可以用下面的操作:

alter ignore table user add unique index(user_id,user_name);

它會刪除重複的記錄(別怕,會保留一條),然後建立唯一索引,高效而且人性化。

尤其是綠色的那條sql,在建立索引的同時刪除了重複資料,相當有用。

檢視索引  show index from 資料庫表名

alter table 資料庫add index 索引名稱(資料庫欄位名稱)

primary key(主鍵索引)

alter table `table_name` add primary key ( `column` )

unique(唯一索引)

alter table `table_name` add unique (`column`)

index(普通索引)

mysql>alter table `table_name` add index index_name ( `column` )

fulltext(全文索引)

alter table `table_name` add fulltext ( `column` )

多列索引

alter table `table_name` add index index_name ( `column1`, `column2`, `column3` )

1.普通索引。

這是最基本的索引,它沒有任何限制。它有以下幾種建立方式:

(1)建立索引:create index indexname on tablename(tablecolumns(length));如果是char,varchar型別,length可以小於字段實際長度;如果是 blob 和 text 型別,必須指定length,下同。

(2)修改表結構:alter tablename add index [indexname] on (tablecolumns(length))

(3)建立表的時候直接指定:create table tablename ( [...], index [indexname] (tablecolumns(length)) ;

2.唯一索引。

它與前面的"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:

(1)建立索引:create unique index indexname on tablename(tablecolumns(length))

(2)修改表結構:alter tablename add unique [indexname] on (tablecolumns(length))

(3)建立表的時候直接指定:create table tablename ( [...], unique [indexname] (tablecolumns(length));

3.主鍵索引

它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引:create table testindex(i_testid int not null auto_increment,vc_name varchar(16) not null,primary key(i_testid)); 當然也可以用alter命令。

加快mysql匯入 匯出速度

mysql匯出的sql語句在處理百萬級資料的時候,可能匯入要花幾小時。在匯出時合理使用幾個引數,可以大大加快匯入的速度.e 使用包括幾個values列表的多行insert語法 max allowed packet 客戶端 伺服器之間通訊的快取區的最大大小 net buffer length tcp ...

mysql插入 mysql條件插入

新建表 create table t user usernamevarchar 100 gender varchar 2 帶條件插入,如果表中沒有username name1 的記錄,就插入,否則就不插入 insert into t user select name1 m from dual whe...

mysql 重啟例項 mysql加快重啟例項的速度

有時候由於業務維護視窗比較短的原因,需要快速的重啟mysql例項 1 set global innodb max dirty pages pct 0 2 觀察 root mysql01 mysqladmin ext grep dirty innodb buffer pool pages dirty ...