MySQL 存储过程执行需要很长时间
MySQL Stored Procedure execution takes a long time
我正在尝试通过存储过程将行插入数据库 table。我的 table 包含超过 500000 行,所以当我执行该过程时,执行时间超过 4 小时。
知道我正在使用 Xampp server, MySQL 作为数据库管理系统和 HeidiSQL
操纵数据库。
下面是程序脚本。代码是否有任何问题,或者我应该添加其他内容。
提前感谢您的帮助。
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE post_id BIGINT;
DECLARE v_id BIGINT;
DECLARE done INT DEFAULT 0;
DECLARE msg varchar(10000) DEFAULT "";
DEClARE post_cursor CURSOR FOR
SELECT distinct po.post_id FROM wp_postmeta po;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET finished = 2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
Open post_cursor;
get_posts: LOOP
FETCH post_cursor INTO post_id;
select CONCAT('postid', post_id) ;
IF done = 1 THEN
LEAVE get_posts;
END IF;
SET v_id = (select MAX (meta_id) from wp_postmeta) +1 ;
INSERT INTO wp_postmeta (meta_id, post_id, meta_key, meta_value) VALUES (v_id, post_id ,"_company_name", "blabla");
SET done = 0;
END LOOP;
CLOSE post_cursor;
END
我会这样做:
INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT id, '_company_name', 'blabla'
FROM wp_posts;
不需要游标,只需要依靠 INSERT...SELECT.
不需要 DISTINCT,因为您知道 wp_posts
table.
中的每个 post 正好对应一行
不需要max(meta_id)+1
,只需依靠自动增量来完成它的工作。
wp_postmeta 在 meta_id 上有一个 auto_incrememnt,所以使用
重点是GROUP BY
保证只插入1个post_id
CREATE TABLE wp_postmeta (meta_id int AUTO_INCREMENT PRIMARY KEY, post_id int, meta_key VARCHAR(20), meta_value VARCHAR(20))
INSERt into wp_postmeta ( post_id, meta_key, meta_value) VALUEs (1,'teata','testb'),(1,'teata','testb'),(2,'teata','testb'),(2,'teata','testb')
INSERT INTO wp_postmeta ( post_id, meta_key, meta_value) SELECT po.post_id ,"_company_name", "blabla" FROM wp_postmeta po GROUP BY po.post_id
SELECT * FROM wp_postmeta
meta_id | post_id | meta_key | meta_value
------: | ------: | :------------ | :---------
1 | 1 | teata | testb
2 | 1 | teata | testb
3 | 2 | teata | testb
4 | 2 | teata | testb
5 | 1 | _company_name | blabla
6 | 2 | _company_name | blabla
db<>fiddle here
我正在尝试通过存储过程将行插入数据库 table。我的 table 包含超过 500000 行,所以当我执行该过程时,执行时间超过 4 小时。 知道我正在使用 Xampp server, MySQL 作为数据库管理系统和 HeidiSQL 操纵数据库。 下面是程序脚本。代码是否有任何问题,或者我应该添加其他内容。 提前感谢您的帮助。
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE post_id BIGINT;
DECLARE v_id BIGINT;
DECLARE done INT DEFAULT 0;
DECLARE msg varchar(10000) DEFAULT "";
DEClARE post_cursor CURSOR FOR
SELECT distinct po.post_id FROM wp_postmeta po;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET finished = 2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
Open post_cursor;
get_posts: LOOP
FETCH post_cursor INTO post_id;
select CONCAT('postid', post_id) ;
IF done = 1 THEN
LEAVE get_posts;
END IF;
SET v_id = (select MAX (meta_id) from wp_postmeta) +1 ;
INSERT INTO wp_postmeta (meta_id, post_id, meta_key, meta_value) VALUES (v_id, post_id ,"_company_name", "blabla");
SET done = 0;
END LOOP;
CLOSE post_cursor;
END
我会这样做:
INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT id, '_company_name', 'blabla'
FROM wp_posts;
不需要游标,只需要依靠 INSERT...SELECT.
不需要 DISTINCT,因为您知道 wp_posts
table.
不需要max(meta_id)+1
,只需依靠自动增量来完成它的工作。
wp_postmeta 在 meta_id 上有一个 auto_incrememnt,所以使用
重点是GROUP BY
保证只插入1个post_id
CREATE TABLE wp_postmeta (meta_id int AUTO_INCREMENT PRIMARY KEY, post_id int, meta_key VARCHAR(20), meta_value VARCHAR(20))
INSERt into wp_postmeta ( post_id, meta_key, meta_value) VALUEs (1,'teata','testb'),(1,'teata','testb'),(2,'teata','testb'),(2,'teata','testb')
INSERT INTO wp_postmeta ( post_id, meta_key, meta_value) SELECT po.post_id ,"_company_name", "blabla" FROM wp_postmeta po GROUP BY po.post_id
SELECT * FROM wp_postmeta
meta_id | post_id | meta_key | meta_value ------: | ------: | :------------ | :--------- 1 | 1 | teata | testb 2 | 1 | teata | testb 3 | 2 | teata | testb 4 | 2 | teata | testb 5 | 1 | _company_name | blabla 6 | 2 | _company_name | blabla
db<>fiddle here