簡體   English   中英

MySQL表-如何在十億行表上快速插入?

[英]MySQL table - how to do the INSERTing fast on a billion row table?

我有一個約2000萬行的表,在填充時最終將是約10億行。

我注意到插入實際上變得很慢,我幾乎無法完成2%。

創建表語句為:

    CREATE TABLE `slots` (
 `customerid` int(11) NOT NULL,
 `orderid` int(11) NOT NULL,
 `queueid` int(11) NOT NULL AUTO_INCREMENT,
 `item_id` int(3) NOT NULL,
 `variable1` int(3) NOT NULL,
 `variable2` int(3) NOT NULL,
 `variable3` int(3) NOT NULL,
 `variable4` int(3) NOT NULL,
 `variable5` int(3) NOT NULL,
 `variable6` int(3) NOT NULL,
 `variable7` tinyint(1) NOT NULL,
 `variable8` tinyint(1) NOT NULL,
 `variable9` tinyint(1) NOT NULL,
 PRIMARY KEY (`customerid`,`orderid`,`queueid`),
 UNIQUE KEY `queueid` (`queueid`),
 KEY `orderid` (`orderid`)
) ENGINE=InnoDB AUTO_INCREMENT=25883472 DEFAULT CHARSET=latin1

現在,插入的PHP腳本的工作方式如下:

  1. 獲取數據。
  2. 創建500-1000行INSERT IGNORE語句(將它們插入一個“ go”中,而不是通過進行500-1000個單獨的INSERT操作)。
  3. 執行INSERT IGNORE查詢。

我被困在每分鍾22次INSERT上(乘以500-1000-等於每分鍾插入大約11000-22000行或每秒大約插入150-350行),我想這樣會更快嗎? 以這種速度,我將花費數月的時間來收集所有數據,而我需要在幾天之內完成...

我正在通過API收集數據-也許我可以將它們全部放入一個大文件中,然后以某種方式通過批處理INSERT以外的方式將其導入一批?

我對此感到非常困惑,也非常感謝知識淵博的人的幫助。

這個評論太長了。

加載表后,刪除索引並再次添加回去。 構建需要一段時間,但是負載會更快。

您應該將表作為文件集“獲取”。 分別將文件分別加載到表或登台表中。 如果是后者,則應該像下面這樣執行單個插入語句:

insert into t(...)
   select . . .
   from staging_table;

(也可能有where子句)。

我真正不明白的是為什么您有一個三部分的主鍵,其中一個是自動遞增的列。 似乎queue_id應該是主鍵(這將進一步導致觀察到該表應被稱為queuesqueue_id應該是slot_id )。

使用多行插入語法最有效的方法是

INSERT INTO table (field, field2, etc) VALUES (1, 2, etc),(1, 2, etc),(1, 2, etc);

手冊

使用VALUES語法的INSERT語句可以插入多行。 為此,請包括多個列值列表,每個列值括在括號內並用逗號分隔。 例:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

每行的值列表必須用括號括起來。

編輯。

看到這里,有關於這個的很好的信息: http : //dev.mysql.com/doc/refman/5.1/en/insert-speed.html

包含

  • 使用多個VALUES列表
  • 利用INSERT DELAYED功能
  • “並發插入”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM