[英]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 JOIN
的ON
子句中,否則您丟失的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.