2

我的问题涉及查询 sql 的优化。

我的查询检索成员列表及其上一次培训。

为了获得最新的培训,我对返回所有成员的完整培训列表的查询结果进行了联接。

此查询有效,但速度很慢,如果有人能提供更快执行的解决方案,我真的很感兴趣。

我的查询(大约 16 秒):

SELECT 
    m.nom,
    m.prenom,
    m.ville,
    m.maj,
    mbf.libelle,
    mbf.datefin,
    m.id as idmb
FROM
    membres m
    LEFT JOIN (
        select *
        from membreform
        where idformation = 1
        order by datefin DESC
    ) as mbf ON mbf.idmembre = m.id
WHERE
    role > 0 AND visible = 1
group by m.id
ORDER BY m.maj DESC
limit 0 , 20

我的数据结构:

成员表单(1000 个条目)

  • idint(11) NOT NULL AUTO_INCREMENT,
  • idmembreint(11) 非空,
  • libellevarchar(128) 非空,
  • idformationint(11) 非空,
  • datedebut日期不为空,
  • datefindate NOT NULL DEFAULT '0000-00-00',
  • descript文本不为空,
  • id( id),
  • idmembre( idmembre),
  • idformation( idformation)

成员(500 个条目)

  • idint(3) NOT NULL AUTO_INCREMENT,
  • nomvarchar(255) 非空,
  • prenomvarchar(255) 非空,
  • villevarchar(255) 非空,
  • emailvarchar(255) 非空,
  • maj日期时间不为空,
  • roletinyint(4) NOT NULL DEFAULT '1',
  • 主键 ( id),
  • role( role),
  • maj( maj)

我以另一种方式进行了测试(大约 0.40 秒),但我觉得不是很干净

SELECT 
    m.nom,
    m.prenom,
    m.ville,
    m.maj,
    m.id as idmb,
    (select 
            libelle
        from
            membreform
        where
            idformation = 1
                AND m.id = membreform.idmembre
        order by datefin DESC
        limit 1
    ) libelle,
    (select 
            datefin
        from
            membreform
        where
            idformation = 1
                AND m.id = membreform.idmembre
        order by datefin DESC
        limit 1
    ) datefin
FROM
    membres m
WHERE
    role > 0 AND visible = 1
group by m.id
ORDER BY m.maj DESC
limit 0 , 20

我愿意接受任何建议,因为我有点卡住了

谢谢你

4

1 回答 1

0

您可以使用临时表来提高性能。例如(MS SQL)第 1 步 - 通过添加所有相关的 where 条件将 memberform 数据放入临时表

select * INTO #TempMembreform from membreform where idformation = 1 ... order by datefin DESC

2 步 - 像在上面的第一个示例中那样执行左外连接。例如

SELECT 
    m.nom,
    m.prenom,
    m.ville,
    m.maj,
    mbf.libelle,
    mbf.datefin,
    m.id as idmb
FROM
    membres m
    LEFT JOIN #TempMembreForm as mbf 
        ON mbf.idmembre = m.id
WHERE
    role > 0 AND visible = 1
group by m.id
ORDER BY m.maj DESC
limit 0 , 20

3 步 - 如果数据不是关键任务(例如 Bank tracnsactions ),则添加 NOLOCK 关键字

select *
INTO #TempMembreform 
from membreform WITH(NOLOCK)
where idformation = 1
order by datefin DESC

SELECT 
    m.nom,
    m.prenom,
    m.ville,
    m.maj,
    mbf.libelle,
    mbf.datefin,
    m.id as idmb
FROM
    membres m with(nolock)
    LEFT JOIN #TempMembreForm as mbf 
        ON mbf.idmembre = m.id
WHERE
    role > 0 AND visible = 1
group by m.id
ORDER BY m.maj DESC
limit 0 , 20

我的简历

于 2012-11-30T12:30:54.330 回答