【问题标题】:Retrieving a huge amount of data using MySQL使用 MySQL 检索大量数据
【发布时间】:2020-02-03 19:02:40
【问题描述】:

我有一个由 7 个表组成的数据库,每个表包含数百万条记录。我正在尝试使用聚合函数和 JOIN 子句从不同的表中检索数据。我正在使用 MySQL Workbench 和 phpMyAdmin 来运行查询。

问题是即使我限制了记录数,我也无法检索数据。但是,当我指出检索所需记录的 ID 时,它工作正常。例如:

select avg(grade) 
from TableA 
inner join TableB on TableA.ID = TableB.ID limit 5;

如果我使用上述查询,MySQL 将停止工作,直到失去与服务器的连接。

select avg(grade) 
from TableA 
inner join TableB on TableA.ID = TableB.ID 
where TableA.ID = 1 OR TableA.ID = 2 .... to 5

在最后一次查询中,MySQL 将返回所需的结果。

如果可以的话,我想优化这些查询,而不是增加服务器超时。

【问题讨论】:

  • 请提供表格结构。错误的表索引可能会导致查询执行速度变慢
  • 能否为失败的查询添加explain plan
  • 也许你想要TableB?? (on TableA.ID = TableA.ID)
  • 提供的信息不清楚。您必须指定您拥有的数据的性质。例如,为了简化读者的任务,您必须指定表的结构以及您拥有什么样的数据。但是,这类问题很难给出答案。

标签: mysql join


【解决方案1】:

在您的示例查询中:

  1. 读取一张表的所有内容。如果有有用的WHERE 子句,则小于“全部”。 (在你的任何一种情况下都没有。)
  2. 对于该表中的每一行,找到下一个表中的匹配行。这使用ON 子句和WHERE 子句(如果相关)。 (您有ON,但两个查询都没有可用的WHERE;见下文。)
  3. 这为您提供了一个很大的临时表。
  4. 执行任何其他过滤 - 例如 WHERE .. OR ..
  5. 进行聚合。
  6. 对结果进行排序。哦,没有ORDER BY
  7. 根据LIMIT 传递几行。

也就是说,大部分工作都发生在LIMIT 之前。 (在某些情况下,INDEX 甚至可以在 LIMIT 中有效,但在您的示例中却没有。)

grade 在哪个表中?它真的能给你正确的答案吗?这两个表是 1:1 关系还是 1:many?如果 1:many,您不应该对其中一张表执行 AVG然后 执行 JOIN?注意:这将加快速度。请提供SHOW CREATE TABLE,以便我进一步帮助您。

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2010-11-23
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多