簡體   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