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