【问题标题】:Strange Mysql Query Performance on ViewView 上奇怪的 Mysql 查询性能
【发布时间】:2017-10-18 19:44:20
【问题描述】:

我有一个看法:vcompanyendofday

以下查询只需 0.7 秒即可执行

Select * from vcompanyendofday

但是这个查询的简单 where 条件大约需要 200.0 秒

select * from vcompanyendofday where companyid <= 51;

这是视图定义:

 CREATE VIEW `vcompanyendofday` AS 
  select  `c`.`companyid` AS `companyid`,
          `c`.`scripcode` AS `scripcode`,
          `e`.`eoddate` AS `eoddate`,
          `e`.`prevclose` AS `prevclose`,
          `e`.`delqty` AS `delqty` 
  from    (
          `company` `c`
  left join
          `endofday` `e`
  on      ((`c`.`companyid` = `e`.`companyid`)))
  where   (`e`.`eoddate` =
          (
          select  max(`e2`.`eoddate`) AS `max(eoddate)`
          from    `endofday` `e2` 
          where (`e2`.`companyid` = `c`.`companyid`)
          )
  );

【问题讨论】:

    标签: mysql optimization


    【解决方案1】:

    您似乎在endofday.companyid 上没有索引

    当您添加条件时,company 在连接中成为前导,并杀死所有性能。

    endofday.companyid上创建索引:

    CREATE INDEX ix_endofday_companyid ON endofday(companyid)
    

    顺便说一句,如果要返回所有公司,则需要将子查询放入OUTER JOINON 子句中,否则您缺少的endofday 将被过滤掉:

    CREATE VIEW `vcompanyendofday` AS 
    select  `c`.`companyid` AS `companyid`,
            `c`.`scripcode` AS `scripcode`,
            `e`.`eoddate` AS `eoddate`,
            `e`.`prevclose` AS `prevclose`,
            `e`.`delqty` AS `delqty` 
    from    (
            `company` `c`
    left join
            `endofday` `e`
    on      `c`.`companyid` = `e`.`companyid`
            AND `e`.`eoddate` =
            (
            select  max(`e2`.`eoddate`) AS `max(eoddate)`
            from    `endofday` `e2` 
            where (`e2`.`companyid` = `c`.`companyid`)
            )
    

    【讨论】:

    • 酷!有用。谢谢你第一次查询需要 2.5 秒,第二次查询需要 0.02 秒。
    【解决方案2】:

    您是否尝试过使用 WHERE 子句自行创建视图的选择,看看会发生什么?

    如果出现问题,请在该查询上运行 EXPLAIN 以查看发生了什么。

    据推测,其中一张表中没有关于 companyid 的索引,很可能是 endofday。

    【讨论】:

    • 为什么不对第一次查询的结果执行where条件?所以只需要 0.7 秒 + 几秒。
    • 当您在其上运行 WHERE 时,它会获取完整的结果集然后对其进行过滤。如果它过滤的列没有被索引,它会进行全表扫描。
    猜你喜欢
    • 2011-05-11
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2017-03-05
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多