【发布时间】:2012-11-30 20:36:33
【问题描述】:
我的问题是关于查询 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
我的数据结构:
membreform(1000 个条目)
-
idint(11) NOT NULL AUTO_INCREMENT, -
idmembreint(11) 非空, -
libellevarchar(128) NOT NULL, -
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) NOT NULL, -
prenomvarchar(255) 非空, -
villevarchar(255) NOT NULL, -
emailvarchar(255) NOT NULL, -
majdatetime NOT NULL, -
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
我愿意接受任何建议,因为我有点卡住了
谢谢
【问题讨论】:
标签: optimization join