如何加速 sql 子查询

How to speed up sql sub query

我正在 运行 工作,运行 花了太长时间。

我创建了一个作业来根据多个表的值进行更新

UPDATE applicant_scores 
  SET applicant_scores.Age=2.5
where applicant_scores.Applicant_id in 
  (select applicantinfo.subebno from applicantinfo
   WHERE SUBSTR(applicantinfo.DOB,7,4) ='1985')

这应该更新一个包含大约 17000 行的列,但它花费的时间太长。

我建议使用 not exists 和索引:

UPDATE applicant_scores 
  SET applicant_scores.Age = 2.5
  WHERE EXISTS (SELECT 1
                FROM applicantinfo ai
                WHERE appliacnt_scores.Applicant_id = ai.subebno AND 
                      SUBSTR(ai.DOB, 7, 4) ='1985'
               );

为了性能,您需要在 applicantinfo(subebno, DOB) 上建立索引。

注:DOB大概意思是"date of birth"。它应该作为 date 存储在您的数据库中,并且您应该使用适当的日期函数,例如:

extract(year from dob) = 1985
year(dob) = 1985
dob >= '1985-01-01' and dob < '1986-01-01'

不要将日期存储为字符串。不要在日期上使用字符串函数。

   SET Age_Score=(SELECT Age_Score FROM age_scoretbl WHERE  SUBSTR(applicantinfo.DOB,7,4)= age_scoretbl.Birth_Year);```






你的问题是这样的:

WHERE SUBSTR(applicantinfo.DOB,7,4) ='1985'

数据库无法快速找到符合该条件的所有行。没有索引。它必须检查数据库中的每一行以找到与该表达式匹配的行。

您的一个解决方案是您可以在 table 中添加另一列,也许将其命名为 dob_year,然后就是该日期之后的年份。那么,你CREATE INDEX applicantinfo_dob_year ON applicantinfo(dob_year)。然后将 WHERE 子句更改为 WHERE dob_year ='1985')

https://use-the-index-luke.com/ 是一个了解数据库索引以及如何正确使用它们来加快查询速度的好网站。