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