[英]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.