【问题标题】:Optimise slow MySQL Query优化 MySQL 慢查询
【发布时间】:2013-12-13 07:32:40
【问题描述】:

我正在使用 MySQL,但此查询存在一些性能问题:

 SELECT s.ID, headline, uId, teaser, hide_image_archiv, image, image_caption, date_format(cDate, '%d.%m.%Y | %H:%i Uhr') as date, channelid, channel_article.name FROM
        (SELECT article.ID, uId, headline, teaser, cDate, image, image_caption, channelid, hide_image_archiv
 FROM article
        inner join article_cCountry on article.ID = ID1 and ID2 = 1
 WHERE sDate < now()
        and (eDate > now() or eDate = 0)
        and released = 'TRUE'
        and (uId in (select ID from user where released = 1) or uId = 0)
 ORDER BY cDate DESC) AS s, channel_article where channelid = channel_article.ID AND channelid = 8 order by cDate desc LIMIT 3

解释:

大约需要 0.30 - 0.40 秒

有什么办法可以优化吗?

【问题讨论】:

    标签: php mysql database query-optimization


    【解决方案1】:

    查询:

    SELECT article.ID,
              uId,
              headline,
              teaser,
              cDate,
              image,
              image_caption,
              channelid,
              hide_image_archiv,
              channel_article.name
       FROM article
       INNER JOIN article_cCountry ON article.ID = ID1
        AND ID2 = 1
       INNER JOIN channel_article
        ON channelid = channel_article.ID
        AND channelid = 8
       WHERE sDate < now()
         AND (eDate > now()
              OR eDate = 0)
         AND released = 'TRUE'
         AND (uId IN
                (SELECT ID
                 FROM USER
                 WHERE released = 1)
              OR uId = 0)
       ORDER BY cDate DESC LIMIT 3
    

    【讨论】:

    • 惊人的 ;) 0.0019 秒
    • 我用“AND channelid != 8”而不是“AND channelid = 8”尝试了另一个查询(0.3 秒而不是 0.0019)为什么 != 比 = 慢?
    【解决方案2】:

    你可以试试这个,

    SELECT *
    FROM
    (
    SELECT s.ID, headline, uId, teaser, hide_image_archiv, image, image_caption, date_format(cDate, '%d.%m.%Y | %H:%i Uhr') as date, channelid, channel_A.name, 
    case when eDate = 0 the 1 when eDate > now() then 1 else 0 end as FILTER_IND1,
    CASE WHEN sDate < now() THEN 1 ELSE 0 END AS FILTER_IND2
    FROM article
    inner join article_cCountry on article.ID = ID1 and ID2 = 1 AND released = 'TRUE' AND CHANNELID = 8
    INNER JOIN 
    (
        SELECT 0 FROM DUAL
        UNION 
        SELECT ID FROM USER WHERE RELEASED = 1 
    ) AS U
    ON U.ID = UID
    INNER JOIN CHANNEL_ARTICLE AS A 
    ON A.ID = CHANNELID
    ) A
    WHERE FILTER_IND = 1
    ORDER BY CDATE DESC
    LIMIT 3 
    

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多