繁体   English   中英

视图上奇怪的Mysql查询性能

[英]Strange Mysql Query Performance on View

我有一个观点:vcompanyendofday

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

Select * from vcompanyendofday

但是此查询的条件很简单,大约需要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`)
          )
  );

似乎您在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`)
        )

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

如果发生此问题,请对该查询运行EXPLAIN以查看发生了什么。

猜测,其中一张表中没有公司索引的索引,很可能是在最后一天。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM