我有 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
有谁能告诉我持续时间,是取决于我使用的表还是查询?
注意:即使尝试索引,结果时间也没有太大差别。
谢谢
4条答案
按热度按时间5tmbdcev1#
要改进ojones的答案,请注意
将很快(假设给定索引)找到所需列表的末尾。然后,添加此选项将主查询限制为只包含所需的行:
然而,有一个问题。如果表中的行数少于200行,则子查询将不返回任何内容。
你好像在准备“分页”?在这种情况下,可以使用类似的方法来找到起始值:
这也避免了使用效率低下的
OFFSET
,它必须读取,然后抛出,所有的行被跳过。更多但真正的解决方案可能是建立和维护一个数据汇总表。它将包含每个月的小计。然后对摘要表运行查询——可能快10倍。更多
ax6ht2ek2#
如果是mssqlserver,您将使用
WITH (NOLOCK)
mysql的等价物是gywdnpxw3#
有两种方法:
一种方法是在满足查询所需的列上创建覆盖索引。查询的正确索引按以下顺序包含以下列:
(SalesChannel, UnitPrice)
.为什么这样有帮助?一方面,索引本身包含满足查询所需的所有数据,而不包含其他任何数据。这意味着您的服务器所做的工作更少。
另一方面,mysql的索引是btree组织的。这意味着他们可以按顺序进入。这样你的查询就可以满足了
SalesChannel
mysql不需要内部临时表。这样更快。第二种方法是认识到这一点
ORDER BY ... LIMIT
是一个臭名昭著的性能反模式。您需要mysql对一大堆数据进行排序,然后丢弃大部分数据。你可以试试这个:
如果你有索引
SalesChannel
(上面提到的覆盖指数是有效的)这会大大加快你的速度,因为你的(GROUP BY
)查询只需要考虑表的一个子集。bnl4lu3b4#
你的问题是“按2 asc订购”。试试这个“按频道订购”。