【问题标题】:Slow query performance in MySQLMySQL 中的低查询性能
【发布时间】: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

标签: mysql sql performance query-optimization groupwise-maximum


【解决方案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 键上建立索引。

【讨论】:

    猜你喜欢
    • 2022-10-13
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2011-05-06
    • 2011-10-23
    相关资源
    最近更新 更多