一、背景:
项目过程中遇到一个需求,需要将gitlab上的代码仓和文件通过API存入到数据库中,并对其打标(红绿黄区),通过API拉取后,发现一共有10万条数据,效果图如下。
写了一个SQL ,达成的效果是将gitlab_code_level的file_path列去掉最后一个/及前面的内容,与本表进行对比,返回 父级 ID:
UPDATE gitlab_code_level
SET parent_id = (
SELECT
p_id
FROM
(
SELECT
b.*, a.id AS p_id
FROM
(
SELECT
*, LEFT (
TRIM(
TRAILING SUBSTRING_INDEX(file_path, '/' ,- 1)
FROM
file_path
),
length(
TRIM(
TRAILING SUBSTRING_INDEX(file_path, '/' ,- 1)
FROM
file_path
)
) - 1
) AS parent_path
FROM
gitlab_code_level
) AS b
LEFT JOIN gitlab_code_level AS a ON b.parent_path = a.file_path
AND b.project_id = a.project_id
) AS gitlab_code_level1
WHERE
gitlab_code_level.id = gitlab_code_level1.id
)
但失败了,所以想一步一步看看情况,截取了之中一段,没想到查询了很久没有反应,Navicat显示‘正在运行’很久都没反应,也关闭不了,网上找了个办法杀掉进程,方法如下:
select * from INFORMATION_SCHEMA.processlist查看卡住的ID
在kill ID杀死
后来参考了CSDN的一位大神的文章,对标进行了索引,将ID和path列都做了索引后,查询效率大大提升,仅用了2.6秒,效果图如下: