mysql查询需要更多的时间来获取数据[mysql]

vltsax25  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(287)

我有 500000 我的中的记录表 MySQL server . 运行查询时,执行查询需要更多的时间。有时超过一分钟。
下面我添加了mysql机器的详细信息。
ram-16gb
处理器:intel(r)-core™ i5-4460m cpu@3.20ghz
操作系统:windows server 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

有谁能告诉我持续时间,是取决于我使用的表还是查询?
注意:即使尝试索引,结果时间也没有太大差别。
谢谢

9ceoxa92

9ceoxa921#

你的问题是“按2 asc订购”。试试这个“按频道订购”。

wyyhbhjk

wyyhbhjk2#

有两种方法:
一种方法是在满足查询所需的列上创建覆盖索引。查询的正确索引按以下顺序包含以下列: (SalesChannel, UnitPrice) .
为什么这样有帮助?一方面,索引本身包含满足查询所需的所有数据,而不包含其他任何数据。这意味着您的服务器所做的工作更少。
另一方面,mysql的索引是btree组织的。这意味着他们可以按顺序进入。这样你的查询就可以满足了 SalesChannel mysql不需要内部临时表。这样更快。
第二种方法是认识到这一点 ORDER BY ... LIMIT 是一个臭名昭著的性能反模式。您需要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

如果你有索引 SalesChannel (上面提到的覆盖指数是有效的)这会大大加快你的速度,因为你的( GROUP BY )查询只需要考虑表的一个子集。

kdfy810k

kdfy810k3#

要改进ojones的答案,请注意

SELECT SalesChannel FROM samplesalesdata50000
    ORDER BY SalesChannel LIMIT 200, 1

将很快(假设给定索引)找到所需列表的末尾。然后,添加此选项将主查询限制为只包含所需的行:

WHERE SalesChannel < (that-select)

然而,有一个问题。如果表中的行数少于200行,则子查询将不返回任何内容。
你好像在准备“分页”?在这种情况下,可以使用类似的方法来找到起始值:

WHERE SalesChannel >= ...
  AND SalesChannel  < ...

这也避免了使用效率低下的 OFFSET ,它必须读取,然后抛出,所有的行被跳过。更多
但真正的解决方案可能是建立和维护一个数据汇总表。它将包含每个月的小计。然后对摘要表运行查询——可能快10倍。更多

jqjz2hbq

jqjz2hbq4#

如果是mssqlserver,您将使用 WITH (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 ;

相关问题