代码之家  ›  专栏  ›  技术社区  ›  Prabu

奇怪的mysql查询性能

  •  0
  • Prabu  · 技术社区  · 17 年前

    我有一个观点: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`)
              )
      );
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Quassnoi    17 年前

    好像你没有索引 endofday.companyid

    当你添加条件时, company 成为加入中的领先者,并终止所有性能。

    在上创建索引 endofday.companyid公司 :

    CREATE INDEX ix_endofday_companyid ON endofday(companyid)
    

    顺便说一下,如果希望返回所有公司,则需要将子查询放入 ON 条款 OUTER JOIN 或者你失踪了 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
  •  0
  •   Powerlord    17 年前

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

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

    估计其中一个表中没有关于companyID的索引,很可能是endofday。