Mysql按速度订购

Mysql按速度订购,mysql,sql,sql-order-by,query-optimization,mysql-5.7,Mysql,Sql,Sql Order By,Query Optimization,Mysql 5.7,有两个样本 在第一个示例中,当使用orderby时,它提供了更快的结果。根据phpmyadmin速度报告 在另一个例子中,我不使用orderby,它会给出较慢的结果。根据phpmyadmin速度报告 使用Orderby时,它会快速产生结果,这难道不合理吗 排名对我来说并不重要,重要的是速度 select bayi,tutar from siparisler where durum='1' and MONTH(tarih) = MONTH(CURDATE()) and YEAR(tarih)

有两个样本

在第一个示例中,当使用orderby时,它提供了更快的结果。根据phpmyadmin速度报告

在另一个例子中,我不使用orderby,它会给出较慢的结果。根据phpmyadmin速度报告

使用Orderby时,它会快速产生结果,这难道不合理吗

排名对我来说并不重要,重要的是速度

select bayi,tutar 
from siparisler 
where durum='1' and MONTH(tarih) = MONTH(CURDATE()) and YEAR(tarih) = YEAR(CURRENT_DATE()) 
order by id desc
速度:0.0006

select bayi,tutar
from siparisler 
where durum='1' and MONTH(tarih) = MONTH(CURDATE()) and YEAR(tarih) = YEAR(CURRENT_DATE())
速度:0.7785

order by查询的执行速度永远不会比没有order by子句的同一查询快。对行进行排序会给数据库带来更多的工作。在最好的情况下,排序成为不可操作的,因为MySQL首先以正确的顺序获取行:但这只是使两个查询在性能方面相等,并不会使排序更快的查询

order by的结果可能已经被缓存,因此MYSQL直接从缓存中提供结果,而不是实际执行查询

如果性能对您来说是最重要的,那么我建议您更改where谓词,以避免在tarih列上使用日期函数:这样的构造会阻止数据库利用我们所说的谓词不可搜索的索引。考虑:

select bayi, tutar 
from siparisler 
where 
    durum = 1 
    and tarih >= dateformat(current_date, '%Y-%m-01')
    and tarih <  dateformat(current_date, '%Y-%m-01') + interval 1 month
order by id desc

对于这个查询的性能,考虑在DurUM、TALH、IDDEC、BAY、TUTAR上的索引:它应该作为覆盖索引,MySQL可以用来执行整个查询,甚至不看实际数据。对行进行排序会给数据库带来更多的工作。在最好的情况下,排序成为不可操作的,因为MySQL首先以正确的顺序获取行:但这只是使两个查询在性能方面相等,并不会使排序更快的查询

order by的结果可能已经被缓存,因此MYSQL直接从缓存中提供结果,而不是实际执行查询

如果性能对您来说是最重要的,那么我建议您更改where谓词,以避免在tarih列上使用日期函数:这样的构造会阻止数据库利用我们所说的谓词不可搜索的索引。考虑:

select bayi, tutar 
from siparisler 
where 
    durum = 1 
    and tarih >= dateformat(current_date, '%Y-%m-01')
    and tarih <  dateformat(current_date, '%Y-%m-01') + interval 1 month
order by id desc

对于此查询的性能,请考虑在DurUM、TALH、IDDEC、BAY、TUCAR上的索引:它应该作为覆盖索引,MySQL可以用来执行整个查询,甚至不看实际数据。

< P>可以通过解释命令分析它,然后检查与类型字段、索引或所有

对应的值。 例如:


您可以通过EXPLAIN命令对其进行分析,然后检查与类型字段、索引或所有字段对应的值

例如:


首先,我建议将查询编写为:

select bayi, tutar 
from siparisler p
where durum = 1 and -- no quotes assuming this is an integer 
      tarih >= curdate() - interval (1 - day(curdate()) day;
这可以利用durm、tarih上的索引

但这不是你的问题。订单可能会导致完全不同的执行计划。这是假设,但目的是解释这是如何发生的

让我假设如下:

表中只有id desc、durum、tarih的索引。 where子句与几行匹配。 排得很宽。 没有ORDERBY的查询可能会生成一个执行计划,这是一个完整的表扫描。因为行很宽,所以会读取大量不必要的数据

使用ORDERBY的查询可以按顺序读取数据,然后应用where条件。这将比另一个版本快,因为只有符合where条件的行才会被读入


我不能保证这会发生。但是查询中会出现一些违反直觉的情况。

首先,我建议将查询编写为:

select bayi, tutar 
from siparisler p
where durum = 1 and -- no quotes assuming this is an integer 
      tarih >= curdate() - interval (1 - day(curdate()) day;
这可以利用durm、tarih上的索引

但这不是你的问题。订单可能会导致完全不同的执行计划。这是假设,但目的是解释这是如何发生的

让我假设如下:

表中只有id desc、durum、tarih的索引。 where子句与几行匹配。 排得很宽。 没有ORDERBY的查询可能会生成一个执行计划,这是一个完整的表扫描。因为行很宽,所以会读取大量不必要的数据

使用ORDERBY的查询可以按顺序读取数据,然后应用where条件。这将比另一个版本快,因为只有符合where条件的行才会被读入


我不能保证这会发生。但是查询中会出现一些违反直觉的情况。

在0.0006秒时,几乎可以肯定,您是在衡量查询缓存的性能,而不是执行时间。使用SELECT SQL\u NO\u CACHE再次尝试这两个查询,并查看性能差异。

在0.00时

06s,您几乎肯定是在衡量查询缓存的性能,而不是执行时间。请使用SELECT SQL\u NO\u缓存再次尝试这两个查询,并查看性能差异。

@Julia按原样进行操作是另一回事。排序和带出是另一回事。执行计划的比较显示了什么?@PM 77-1上面已经写过的速度将显示查询是如何实现的,并帮助您解释差异。查询缓存是否已打开?请使用SQL\u NO\u缓存重试…@Julia按原样带东西是另一回事。排序和带出是另一回事。执行计划的比较显示了什么?@PM 77-1上面已经写过的速度将显示查询是如何实现的,并帮助您解释差异。查询缓存是否已打开?请使用SQL\u NO\u缓存重试…因此这是来自缓存的。因此,orderby是否会降低使用速度?@othermember:是-或者,正如我在回答中所解释的,它至少不会加快查询速度。那么,如何在mysql的任何表中定义默认的order by id desc?@othermember:没有默认order by这样的东西。另一方面,您可以创建我建议的索引:与我的查询版本一起,它应该有助于MySQL加快速度。然而,我读过的一些资料表明,如果创建索引,查询速度会更快。这和我说的一样吗?这是缓存里的。因此,orderby是否会降低使用速度?@othermember:是-或者,正如我在回答中所解释的,它至少不会加快查询速度。那么,如何在mysql的任何表中定义默认的order by id desc?@othermember:没有默认order by这样的东西。另一方面,您可以创建我建议的索引:与我的查询版本一起,它应该有助于MySQL加快速度。然而,我读过的一些资料表明,如果创建索引,查询速度会更快。这和我说的一样吗?当与整数列比较时,整数文本周围的引号不会影响性能。当与整数列比较时,整数文本周围的引号不会影响性能。