【问题标题】:MySQL query takes 2 minutesMySQL查询需要2分钟
【发布时间】:2021-04-26 00:13:31
【问题描述】:

我有问题。 我正在运行 MySQL PhpMyAdmin 服务器,并且有 3 个表:

  • 烛台数据
  • CandlestickDataHist1
  • CandlestickDataHist2

然后我使用以下源查询创建了一些:

SELECT
    a.*
FROM
    (
    SELECT
        *,
        'CandlestickData' AS SOURCE
    FROM
        CandlestickData
    UNION
SELECT
    *,
    'CandlestickDataHist1' AS SOURCE
FROM
    CandlestickDataHist1
UNION
SELECT
    *,
    'CandlestickDataHist2' AS SOURCE
FROM
    CandlestickDataHist2
) AS a
ORDER BY
    a.MainKey
DESC

这让我看到了 170 万条记录。当我对视图执行以下简单查询时:

SELECT * FROM my_created_view;

执行查询大约需要 2 分钟。有没有办法让它更快?

【问题讨论】:

  • 客户端将如何处理数百万行?通常,你希望在 SQL 内部做更多的处理,然后返回一个文明的行数给客户端。

标签: mysql sql database


【解决方案1】:

您可以使用UNION ALL 而不是UNION 来加快速度:

SELECT cd.*
FROM ((SELECT cd.*, 'CandlestickData' AS SOURCE
       FROM CandlestickData cd
      ) UNION ALL
      (SELECT cd.*, 'CandlestickDataHist1' AS SOURCE
       FROM CandlestickDataHist1 cd
      ) UNION ALL
      (SELECT cd.*, 'CandlestickDataHist2' AS SOURCE
       FROM CandlestickDataHist2 cd
      )
     ) cd
ORDER BY cd.MainKey DESC;

这仍然需要对所有数据进行排序。但是,它将消除删除重复项的开销。我敢说它会快 50%。

如果您真的想加快查询速度,则需要将所有数据存储在一个表中。然后可以为order by 键创建索引。

【讨论】:

  • 那么对于这么多记录来说,这是最快的吗?
  • @A.Vreeswijk 。 . .因为ORDER BY,我认为这可能是你能做的最好的。
  • 是的,您确实已经取消了使用索引进行排序的能力,方法是将相同的数据结构保存在多个表中,而不是放在一个表中
  • 但后来我达到了表中的最大记录数。我想那时我有 950 万条记录。我不知道我得到了哪个错误,但是在表之间拆分数据是解决方案。顺便说一句,我的桌子有 60 列!
  • 真的取决于你想用它做什么。还要考虑一些事情:根据您的客户端(例如 SSMS),您可能会遇到渲染问题,这也是一个瓶颈。你想用这些数据做什么?简单地选择该大小的所有数据而没有限制不是一个正常的用例(在处理应用程序/数据仓库的管道之外),并且在过滤之后您可能会有更好的时间(特别是如果过滤器依赖于索引)那些数据会去偏远的地方吗? - 发生延迟。 60 列对于一个表来说是 FAT,而对于更细的表,数据库的性能会更好。
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2013-09-11
  • 2017-12-26
  • 1970-01-01
相关资源
最近更新 更多