Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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 如何最小化SQL查询以非常快地给出输出?_Mysql_Sql - Fatal编程技术网

Mysql 如何最小化SQL查询以非常快地给出输出?

Mysql 如何最小化SQL查询以非常快地给出输出?,mysql,sql,Mysql,Sql,我有两个查询,其中一个查询为我提供了完整的数据,但问题是执行起来花费了太多时间 我正在使用几个案例,因为它占用了很多时间,我只想知道我是否可以进一步最小化它,这样它就不会影响我的输出,而是执行得更快 查询1 select outlet, sum(netamount) from syncbill where cancelled<>'Y' and year(curdate())=year(billdate) and month(curdate())=month(billdate)

我有两个查询,其中一个查询为我提供了完整的数据,但问题是执行起来花费了太多时间

我正在使用几个案例,因为它占用了很多时间,我只想知道我是否可以进一步最小化它,这样它就不会影响我的输出,而是执行得更快

查询1

select outlet, sum(netamount) 
from syncbill 
where cancelled<>'Y' 
and year(curdate())=year(billdate) 
and month(curdate())=month(billdate) 
group by OUTLET;


我建议您创建两个索引: 一个在“出口”上,用于group by,另一个在“取消”上,用于改进过滤器

CREATE  INDEX ix_outlet ON syncbill(outlet);

然后强制mysql使用这些

select a,b,c
from my_table
force index (ix_cancelled, ix_outlet)
force INDEX (ix_outlet) FOR GROUP BY
where a = condition_1
group by a,b

为了提高新_查询的性能,您应该按照我编写的顺序在三列(取消,出口)上有一个索引;因为在查询执行中,首先执行表达式所在的位置,然后按表达式分组,最后执行select语句;如果索引数据页是使用按此顺序使用的列创建的,则数据查找的速度会提高

CREATE  INDEX ix_cancelled_OUTLET ON syncbill(cancelled, OUTLET);

EXPLAIN
输出是什么样子的?请分享更多关于表结构、示例数据和当前索引的上下文using@rkosegi我已附上两张图片请不要在图片中共享示例数据。没有人想把它们读入数据库来测试解决方案。另外,EXPLAIN的输出在哪里?我不知道你在问什么。您有两个要合并的查询,它们只引用一个表。然后你将它们组合起来,新的表格神秘地出现。这个问题对我来说没有意义。这会提高输出速度吗?它会提高查询速度,因此输出也会提前开始。选择outlet,round(sum(case when year(curdate())=年(billdate)和month(curdate())=月(billdate),然后netamount else 0 end)作为monthAmount,round(sum when year(curdate()+间隔9个月)=年(billdate+间隔9个月),然后netamount ELSE 0 END)作为年金额,四舍五入(总和(billdate>=日期(现在())时的情况,然后netamount ELSE 0 END))作为syncbill的事务,其中取消了“Y”强制索引(ix_取消,ix_出口),强制索引(ix_出口)对于按门店分组这是我根据您给出的建议所做的最后一次查询,但它显示了错误如果有“显示错误”的内容,请共享错误消息请允许您将查询拆分为多行,以便识别错误所在(使用行号)你能帮助我在创建索引后如何编写我的查询吗,或者我应该只通过创建索引运行上一个查询吗?只是你应该创建索引并运行你自己在主帖子中编写的新查询。请在主帖子中编辑我的查询,我很困惑该做什么如果你的表上有一个索引,你不需要更改你的查询,首先删除这个表的所有索引,然后在上面创建ix_cancelled_OUTLET_billdate,然后运行你自己的查询,如果这个索引对查询有用,查询优化器选择了它。我已经创建了您建议的索引,然后运行了我的原始查询,但仍然需要1分钟来获取数据
CREATE  INDEX ix_outlet ON syncbill(outlet);
CREATE  INDEX ix_cancelled ON syncbill(cancelled);
select a,b,c
from my_table
force index (ix_cancelled, ix_outlet)
force INDEX (ix_outlet) FOR GROUP BY
where a = condition_1
group by a,b
CREATE  INDEX ix_cancelled_OUTLET ON syncbill(cancelled, OUTLET);