视图上奇怪的Mysql查询性能

时间:2009-05-04 15:04:27

标签: mysql optimization

我有一个观点: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`)
          )
  );

2 个答案:

答案 0 :(得分:1)

您似乎没有endofday.companyid

的索引

添加条件时,company会在联接中成为领先者,并会杀死所有效果。

endofday.companyid上创建索引:

CREATE INDEX ix_endofday_companyid ON endofday(companyid)

顺便说一句,如果您希望返回所有公司,则需要将子查询放入ON的{​​{1}}子句中,否则您遗失的OUTER JOIN将是过滤掉了:

endofday

答案 1 :(得分:0)

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

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

据猜测,其中一个表中没有关于companyid的索引,很可能是在当天。