我的web應用程序接收逗號分隔的電話列表,該列表必須導入到「聯繫人」表中。該列表可以包含100,000到1,000,000個項目。我實現了存儲過程。但它對我來說仍然工作得太慢。你能幫我改進嗎?如何將大的CSV文件導入到MySQL中
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `import_phones`
(IN ContactGroupId int, IN strPhones mediumtext, OUT total int, OUT inserted int)
main: BEGIN
declare delim varchar(1) default(',');
declare delimPtr int unsigned default(0); -- pointer to current spliter position
declare startPtr int unsigned default(1);
declare phone1 nvarchar(20);
set total = 0; -- counter of total rows
set inserted = 0; -- counter of inserted rows
if strPhones is null or length(strPhones) < 1 then
leave main;
end if;
drop table if exists insertphones;
create temporary table insertphones(phone nvarchar(20))
engine = memory;
/***
-- split strPhones by delimiter
*/
SET delimPtr = locate(delim, strPhones,startPtr);
loop_label: while(delimPtr > 0) do
insert into insertphones (phone) values (substring(strPhones,startPtr,delimPtr-startPtr));
-- select delimPtr,startPtr, substring(strPhones,startPtr,delimPtr-startPtr);
set startPtr = delimPtr+1;
set delimPtr = locate(delim, strPhones,startPtr);
end while;
if delimPtr = 0 then
insert into insertphones (phone) values (substring(strPhones,startPtr,delimPtr-startPtr));
end if;
-- select delimPtr,startPtr;
select count(*) from insertphones into total;
/***
-- insert phones
*/
insert into contacts (Phone, ContactGroupId)
select distinct(phone), ContactGroupId from insertphones where
phone not in (select Phone from contacts where ContactGroupId = ContactGroupId);
SELECT ROW_COUNT() into inserted ;
-- select total, inserted;
END
這屬於在[代碼審查(http://codereview.stackexchange.com/)... – Clive 2013-03-09 12:57:47
克萊夫,其實我並不需要代碼審查,但它可以顯著提高性能方向 – 2013-03-09 18:37:25
這是也是CodeReview.SE所做的。 – Ryan 2013-03-09 20:27:09