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 中的低查询性能的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot JPA+Hibernate 在 SaveAll() 上的低性能

MySQL 查询中的性能

mysql 关联查询是不是很耗性能

如何强制连接顺序以提高 MYSQL 中的查询性能?

MySQL SELECT 查询中的性能问题?

mysql性能中的PDO