[英]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腳本的工作方式如下:
我被困在每分鍾22次INSERT上(乘以500-1000-等於每分鍾插入大約11000-22000行或每秒大約插入150-350行),我想這樣會更快嗎? 以這種速度,我將花費數月的時間來收集所有數據,而我需要在幾天之內完成...
我正在通過API收集數據-也許我可以將它們全部放入一個大文件中,然后以某種方式通過批處理INSERT以外的方式將其導入一批?
我對此感到非常困惑,也非常感謝知識淵博的人的幫助。
這個評論太長了。
加載表后,刪除索引並再次添加回去。 構建需要一段時間,但是負載會更快。
您應該將表作為文件集“獲取”。 分別將文件分別加載到表或登台表中。 如果是后者,則應該像下面這樣執行單個插入語句:
insert into t(...)
select . . .
from staging_table;
(也可能有where
子句)。
我真正不明白的是為什么您有一個三部分的主鍵,其中一個是自動遞增的列。 似乎queue_id
應該是主鍵(這將進一步導致觀察到該表應被稱為queues
或queue_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.