Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的Mysql查询性能_Mysql_Optimization - Fatal编程技术网

奇怪的Mysql查询性能

奇怪的Mysql查询性能,mysql,optimization,Mysql,Optimization,我有一个观点:vcompanyendofday 以下查询仅在0.7秒内执行 Select * from vcompanyendofday 但是这个查询的一个简单where条件大约需要200.0秒 select * from vcompanyendofday where companyid <= 51; 您是否尝试过使用WHERE子句自行创建视图的select来查看发生了什么 如果出现问题,请对该查询运行EXPLAIN,查看发生了什么 据猜测,其中一个表中没有关于companyid的索引

我有一个观点:vcompanyendofday

以下查询仅在0.7秒内执行

Select * from vcompanyendofday
但是这个查询的一个简单where条件大约需要200.0秒

select * from vcompanyendofday where companyid <= 51;

您是否尝试过使用WHERE子句自行创建视图的select来查看发生了什么

如果出现问题,请对该查询运行
EXPLAIN
,查看发生了什么


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

似乎您在
endofday.companyid上没有索引。

添加条件时,
公司
将在加入中处于领先地位,并终止所有性能

endofday.companyid
上创建索引:

CREATE INDEX ix_endofday_companyid ON endofday(companyid)
顺便说一下,如果希望返回所有公司,则需要将子查询放入
外部联接的
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条件?因此,它只需要0.7秒+几秒。当您在其中运行WHERE时,它会获取完整的结果集,然后对其进行过滤。如果它筛选的列没有索引,它将执行完整表扫描。酷!它起作用了。谢谢第一次查询需要2.5秒,第二次查询需要0.02秒。
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`)
        )