简体   繁体   中英

MySQL Stored Procedure execution takes a long time

I am trying to insert rows into a db table through a stored procedure. My table contains more than 500000 rows so when I execute the procedure, it takes more than 4h executing. Knowing that I am using Xampp server , MySQL as database management system and HeidiSQL to manipulate the db. Below you see the procedure script. Is there any issue with the code or should I add other things. Thanks for your help in advance.

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

I would do it this way:

INSERT INTO wp_postmeta (post_id, meta_key, meta_value) 
 SELECT id, '_company_name', 'blabla'
 FROM wp_posts;

No cursor needed, just rely on INSERT...SELECT.

No DISTINCT needed, since you know there's exactly one row for each post in the wp_posts table.

No max(meta_id)+1 needed, just rely on the auto-increment to do its job.

wp_postmeta has an auto_incrememnt on meta_id, so use

The main point is the GROUP BY that garantees that only 1 post _id is inserted

 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
\nmeta_id |  post_id |  meta_key | meta_value\n------: |  ------: |  :------------ |  :--------- \n      1 |  1 |  teata | testb     \n      2 |  1 |  teata | testb     \n      3 |  2 |  teata | testb     \n      4 |  2 |  teata | testb     \n      5 |  1 |  _company_name |  blabla    \n      6 |  2 |  _company_name |  blabla    \n

db<>fiddle here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM