MySQL 中的低查询性能
Posted
技术标签:
【中文标题】MySQL 中的低查询性能【英文标题】:Slow query performance in MySQL 【发布时间】:2021-10-15 12:54:44 【问题描述】:我想在这里找出导致我的 mysql 查询执行缓慢的原因。在 0.0017 秒(3.6215 秒)内获取了 1 行我该如何优化?
SELECT hadmlog.hpercode as 'HOSPITAL NUMBER', FLOOR (hadmlog.patage) as 'AGE', CONCAT (hperson.patlast, ', ', hperson.patfirst, ' ',hperson.patmiddle) as 'PROFILE', hcity.ctyname as 'DISTRICT', hadmlog.disdate as 'DISCHARGED DATE'
FROM hadmlog
INNER JOIN hperson ON hadmlog.hpercode=hperson.hpercode
INNER JOIN haddr ON hadmlog.hpercode=haddr.hpercode
INNER JOIN hcity ON haddr.ctycode=hcity.ctycode
WHERE hadmlog.patage BETWEEN '1' AND '4'
AND hperson.patsex = 'M'
AND DATE(hadmlog.disdate) = DATE(curdate())
AND haddr.haddrdte = ( select max(haddrdte)
from haddr
where haddr.hpercode = hperson.hpercode )
ORDER BY Profile;
【问题讨论】:
请提供解释方案...... ... 并为所有使用的表提供完整的 CREATE TABLE,包括索引。 ...告诉我们每个表有多少条记录 “在 0.0017 秒 (3.6215 秒) 内获取 1 行”是什么意思? 您需要向我们展示表和索引定义,以及每个表的行数。也许您的表格定义不佳。也许索引没有正确创建。也许您认为您在该列上没有索引。没有看到表和索引定义,我们无法判断。我们需要行计数,因为这会影响查询计划。如果您知道如何执行EXPLAIN
或获取执行计划,请将结果也放入问题中。如果您没有索引,请访问use-the-index-luke.com。
【参考方案1】:
首先,修复查询:
SELECT al.hpercode as HOSPITAL_NUMBER, FLOOR(al.patage) as AGE,
CONCAT_WS(' ', p.patlast, p.patfirst, p.patmiddle) as PROFILE,
c.ctyname as DISTRICT, al.disdate as DISCHARGED_DATE
FROM hadmlog al JOIN
hperson p
ON al.hpercode = p.hpercode JOIN
haddr a
ON al.hpercode = a.hpercode JOIN
hcity c
ON a.ctycode = c.ctycode
WHERE al.patage BETWEEN 1 AND 4 AND
p.patsex = 'M' AND
al.disdate >= curdate() AND
al.disdate < curdate() + INTERVAL 1 day AND
a.haddrdte = (select max(h2.haddrdte)
from haddr h2
where h2.hpercode = p.hpercode
)
ORDER BY Profile;
有些更改是装饰性的(例如表别名和CONCAT_WS()
)。更相关的变化是:
patage
似乎是一个数字,因此请进行比较数字。字符串会阻碍优化器。
date(disdate)
也会阻碍优化器。
那么,对于这个查询,我猜你想要一个索引:
hadmlog(disdate, patage)
然后您希望在用于其他表的 JOIN
键上建立索引。
【讨论】:
以上是关于MySQL 中的低查询性能的主要内容,如果未能解决你的问题,请参考以下文章