我们保持着内容的历史。我们希望获得每个内容的更新条目,创建时间和更新时间应该是内容的第一个条目。该查询包含多个选择以及具有如此多左连接的where子句。数据集非常庞大,因此查询执行时间超过60秒。请帮助改善相同。查询:
select * from (select * from (
SELECT c.*, initCMS.initcreatetime, initCMS.initupdatetime, user.name as partnerName, r.name as rightsName, r1.name as copyRightsName, a.name as agelimitName, ct.type as contenttypename, cat.name as categoryname, lang.name as languagename FROM ContentCMS c
left join ContentCategoryType ct on ct.id = c.contentType
left join User user on c.contentPartnerId = user.id
left join Category cat on cat.id = c.categoryId
left join Language lang on lang.id = c.languageCode
left join CopyRights r on c.rights = r.id
left join CopyRights r1 on c.copyrights = r1.id
left join Age a on c.ageLimit = a.id
left outer join (
SELECT contentId, createTime as initcreatetime, updateTime as initupdatetime from ContentCMS cms where cms.deleted='0'
) as initCMS on initCMS.contentId = c.contentId WHERE c.deleted='0' order by c.id DESC
) as temp group by contentId) as c where c.editedBy='0'
任何帮助都将受到高度赞赏。谢谢。
答案 0 :(得分:1)
只是部分评估和建议,因为您的查询似乎没有正确形成
此左连接似乎无用
FROM ContentCMS c
......
left join (
SELECT contentId
, createTime as initcreatetime
, updateTime as initupdatetime
from ContentCMS cms
where cms.deleted='0'
) as initCMS on initCMS.contentId = c.contentId
同桌
在连接中的子查询中的顺序(无限制)是无用的,因为连接有序值或无序值会产生相同的结果
groupId的组是奇怪的,因为没有聚合函数而且没有聚合函数的组的sue是不推荐使用的是sql 如果你需要不同的值,或者每个contentId只需要一行,你就应该以非随意的方式使用distinct或者反转这个值(使用group by without aggregation function retrive),并且在mysql的最新版本中是不允许的(通过deafult)非汇总列的随意值。
对于部分eval,您的查询应该重构为
SELECT c.*
, c.initcreatetime
, c.initupdatetime
, user.name as partnerName
, r.name as rightsName
, r1.name as copyRightsName
, a.name as agelimitName
, ct.type as contenttypename
, cat.name as categoryname
, lang.name as languagename
FROM ContentCMS c
left join ContentCategoryType ct on ct.id = c.contentType
left join User user on c.contentPartnerId = user.id
left join Category cat on cat.id = c.categoryId
left join Language lang on lang.id = c.languageCode
left join CopyRights r on c.rights = r.id
left join CopyRights r1 on c.copyrights = r1.id
WHERE c.deleted='0'
) as temp
对于其余部分,您应该明确地选择您实际需要为其他人添加适当聚合函数的列
同样,嵌套子查询只是为了不正确地减少行而没有帮助提高性能......你还应该重新评估数据建模和设计。