MySQL存储过程执行需要很长时间

Posted

技术标签:

【中文标题】MySQL存储过程执行需要很长时间【英文标题】:MySQL Stored Procedure execution takes a long time 【发布时间】:2021-09-19 01:47:42 【问题描述】:

我正在尝试通过存储过程将行插入到数据库表中。我的表包含超过 500000 行,因此当我执行该过程时,执行时间超过 4 小时。 知道我使用 Xampp 服务器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

【问题讨论】:

这看起来很不对劲,wp_postmeta 应该有一个 autoincrmenet,而不是 Max +1,因为你必须一直运行,以及循环。当您不必从其他地方获取数据时,这就更没有意义了。那么“_company_name”、“blabla”从何而来。 感谢您的回复。实际上,我正在尝试为表 wp_postmeta 中的每个 post_id 添加相同的值(“_company_name”、“blabla”)。 【参考方案1】:

wp_postmeta 在 meta_id 上有一个 auto_incrememnt,所以使用

重点是GROUP BY,它保证只插入1个帖子_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
元ID | post_id |元密钥 |元值 ------: | ------: | :------------ | :--------- 1 | 1 |茶塔 |测试b 2 | 1 |茶塔 |测试b 3 | 2 |茶塔 |测试b 4 | 2 |茶塔 |测试b 5 | 1 | _公司名称 |废话 6 | 2 | _公司名称 |废话

db小提琴here

【讨论】:

【参考方案2】:

我会这样做:

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

不需要游标,只需依靠 INSERT...SELECT。

不需要 DISTINCT,因为您知道 wp_posts 表中的每个帖子正好有一行。

不需要max(meta_id)+1,只需要依靠自动增量来完成它的工作。

【讨论】:

以上是关于MySQL存储过程执行需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 存储过程在第一次运行时需要很长时间

使用 PHP 返回 mysql 存储过程的输出参数

如何删除 MS SQL Server 存储过程中的 While 循环? [关闭]

Spring Boot:在长时间运行的存储过程中检测到明显的连接泄漏

mysql 怎么导入/执行.SQL(存储过程)文件?

处理在 R 中仍然需要很长时间才能执行的缓存块?