MySQL查询获取数据需要更多时间[MySQL]

MySQL查询获取数据需要更多时间[MySQL],mysql,sql,performance,mysql-workbench,query-performance,Mysql,Sql,Performance,Mysql Workbench,Query Performance,我的MySQL服务器中有500000记录表。运行查询时,执行查询需要更多的时间。有时它会超过一分钟 下面我添加了MySQL机器的详细信息 RAM-16GB 处理器:英特尔(R)-核心™ i5-4460M CPU@3.20GHz 操作系统:Windows服务器64位 我知道我的机器没有问题,因为它是一台独立的机器,没有其他应用程序 也许是我的问题。我浏览了MySql站点,发现我使用了正确的语法。但我不知道结果延迟的确切原因 SELECT SUM(`samplesalesdata50000`.`Un

我的
MySQL服务器中有
500000
记录表。运行查询时,执行查询需要更多的时间。有时它会超过一分钟

下面我添加了MySQL机器的详细信息

RAM-16GB

处理器:英特尔(R)-核心™ i5-4460M CPU@3.20GHz

操作系统:Windows服务器64位

我知道我的机器没有问题,因为它是一台独立的机器,没有其他应用程序

也许是我的问题。我浏览了MySql站点,发现我使用了正确的语法。但我不知道结果延迟的确切原因

SELECT SUM(`samplesalesdata50000`.`UnitPrice`) AS `UnitPrice`, `samplesalesdata50000`.`SalesChannel` AS `Channel`
FROM `samplesalesdata50000` AS `samplesalesdata50000`
GROUP BY `samplesalesdata50000`.`SalesChannel`
ORDER BY 2 ASC
LIMIT 200  OFFSET 0
是否有人能告诉我持续时间取决于我使用的表或查询

注意:即使尝试索引,结果时间也没有太大差异


感谢两种方法:

一种方法是在满足查询所需的列上创建。查询的正确索引按以下顺序包含以下列:
(SalesChannel,UnitPrice)

为什么这有帮助?首先,索引本身包含满足查询所需的所有数据,而不包含其他数据。这意味着您的服务器所做的工作更少

另一方面,MySQL的索引是由BTREE组织的。这意味着它们可以按顺序访问。因此,您的查询可以一次满足一个
SalesChannel
,MySQL不需要内部临时表。那更快

第二种方法包括认识到,
按顺序。。。限制是一种臭名昭著的性能反模式。您需要MySQL对一大堆数据进行排序,然后丢弃大部分数据

你可以试试这个:

SELECT SUM(UnitPrice) UnitPrice,
       SalesChannel Channel
  FROM samplesalesdata50000
 WHERE SalesChannel IN (
         SELECT SalesChannel 
           FROM samplesalesdata50000
          ORDER BY Channel LIMIT 200 OFFSET 0
       )
 GROUP BY SalesChannel 
 ORDER BY SalesChannel 
 LIMIT 200 OFFSET 0

如果你有一个索引>代码> SaltChans[/Cuff](上面提到的覆盖索引),这会加快你的速度,因为你的聚合(<代码>组按)查询只需要考虑表的子集。 您对“按2 ASC订购”的问题。尝试此“按频道订购”。

如果是MS SQL Server,您将使用
和(NOLOCK)

MYSQL的等价物是

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT SUM(`samplesalesdata50000`.`UnitPrice`) AS `UnitPrice`, `samplesalesdata50000`.`SalesChannel` AS `Channel`
FROM `samplesalesdata50000` AS `samplesalesdata50000`
GROUP BY `samplesalesdata50000`.`SalesChannel`
ORDER BY SalesChannel  ASC
LIMIT 200  OFFSET 0
COMMIT ;

要改进OJones的答案,请注意

SELECT SalesChannel FROM samplesalesdata50000
    ORDER BY SalesChannel LIMIT 200, 1
将快速(假设给定索引)找到所需列表的末尾。然后添加此选项将主查询限制为仅需要的行:

WHERE SalesChannel < (that-select)
其中SalesChannel<(选择)
然而,有一个问题。如果表中的行少于200行,子查询将不返回任何内容

你好像在设置“分页”?在这种情况下,可以使用类似的技术来查找起始值:

WHERE SalesChannel >= ...
  AND SalesChannel  < ...
其中SalesChannel>=。。。
销售渠道<。。。
这也避免了使用低效的
偏移量
,该偏移量必须先读取然后丢弃跳过的所有行


但真正的解决方案可能是建立和维护一个数据汇总表。它将包含每个月的小计。然后对汇总表运行查询——可能快10倍

索引不会对汇总所有表数据的查询产生任何影响-mysql无论如何都必须访问每一行,因此它将绕过使用索引-在这种情况下,使用索引实际上会减慢速度。在我们解释任何性能问题之前,您必须发布此查询的计划请使用Order by的显式列/别名;请显示查询计划(带索引和不带索引)和表创建脚本(如果创建了索引,则包括索引),而不是容易出错的列编号。了解saleschannel表中的行的方式也会有所帮助。SQL server还接受
设置事务隔离级别READ UNCOMMITTED