如何使用 InnoDB 引擎减少此查询的查询时间

Posted

技术标签:

【中文标题】如何使用 InnoDB 引擎减少此查询的查询时间【英文标题】:How to decrease Query time of this Query with InnoDB engine 【发布时间】:2015-05-13 13:08:44 【问题描述】:

我正在尝试优化此查询。现在需要 28 秒。

AS 曾经在我的查询中丢失。添加后,查询时间下降了 20%

SELECT
    g.id,
    g.adresid,
    g.senaryoid,
    g.olayid,
    g.gonderilecegitarih
FROM
    (
        SELECT
            adresid
        FROM
            expose2.800_emsenaryolar_emgidenbulten
        WHERE
            olayid = '3320'
    ) AS s
RIGHT JOIN expose2.800_emsenaryolar_emgidenbulten AS g ON s.adresid = g.adresid
WHERE
    s.adresid IS NULL
AND g.olayid = '2784'
AND g.durum = '1'
AND g.gonderilecegitarih < DATE_SUB(
    '2015-05-13 15:40:15',
    INTERVAL 1 DAY
)

【问题讨论】:

AS 只是语法糖。速度上的任何差异都来自缓存和/或外部活动。 【参考方案1】:

如果您在子查询中使用s.adresid IS NULL 条件,它将更快地加入更多行...

SELECT
    g.id,
    g.adresid,
    g.senaryoid,
    g.olayid,
    g.gonderilecegitarih
FROM (
        SELECT adresid FROM expose2.800_emsenaryolar_emgidenbulten WHERE olayid = '3320' and  s.adresid IS NULL
    ) AS s
RIGHT JOIN expose2.800_emsenaryolar_emgidenbulten AS g ON s.adresid = g.adresid

AND g.olayid = '2784'
AND g.durum = '1'
AND g.gonderilecegitarih < DATE_SUB(
    '2015-05-13 15:40:15',
    INTERVAL 1 DAY
)

仍然使用自联接优化此查询。

【讨论】:

s.adresid 不能在里面,因为 'AS s' 是在后面定义的。【参考方案2】:

为了提高速度,将此复合索引添加到g

INDEX(olayid, durum, gonderilecegitarih)

请提供SHOW CREATE TABLE 800_emsenaryolar_emgidenbulten;我想确认您在adresid 上也有索引。

【讨论】:

以上是关于如何使用 InnoDB 引擎减少此查询的查询时间的主要内容,如果未能解决你的问题,请参考以下文章

MySQL——索引视图事务,存储引擎MyLSAM和InnoDB(实战篇!)

mysql的存储引擎如何选择

《MySQL系列-InnoDB引擎15》慢查询日志拓展-如何开启MySQL慢查询日志?

《MySQL系列-InnoDB引擎15》慢查询日志拓展-如何开启MySQL慢查询日志?

MySQL进阶之存储引擎MyISAM与InnoDB的区别

为什么MyISAM会比Innodb的查询速度快