【问题标题】:MYSQL query a billion records and timeout issuesMYSQL查询十亿条记录和超时问题
【发布时间】:2013-07-14 21:51:30
【问题描述】:

我有一个 MYSQL 数据库,其中一个表以每秒 5,000 行的速度增长。我希望这张表能进入数十亿条记录。我现在在php中有一个查询功能:

 $result =mysqli_query($con, "SELECT * FROM table WHERE  `data`='".$input."' LIMIT 0 , 30");

问题很明显,表越大,查询最新记录的时间就越长。到了这一点,该功能刚刚超时。如果我直接从 sql 运行相同的查询,它会做同样的事情。

有没有更好的方法来查询这个表来加快查询时间。是否可以从最后一条记录开始查询,第一条记录并在两者之间递增查询以加快速度?

另外,如果有更快的替代方案,请告诉我。

另外,将表拆分为多个表并在多个较小的表上同时运行查询会更好吗?

【问题讨论】:

  • 你有索引吗?您的查询没有ORDER BY 子句,因此MySQL 会猜测如何对记录进行排序,并且很可能会做出错误 的猜测。在索引列上添加ORDER BY - 没有一个,顺序无论如何都不是确定性的。
  • 我还要补充一点,SELECT * 几乎从不属于生产代码。虽然它不应该减慢查询速度,但它可能会影响 MySQL 选择排序的列。始终明确说明您实际需要的列。
  • 您可以尝试在 data 列上建立索引,但这会因为必须在每次 INSERT 上更新索引而减慢您的更新速度。您或许可以通过使用INSERT DELAYED 来缓解这个问题,或者缓冲您的输入并使用单个INSERT 语句添加大块更新。
  • 在某些时候磁盘访问时间也会成为一个问题。如果我遇到这种情况,我会寻求专业的外部帮助 :-) 分片,水平分区,在这个级别上你需要知道的各种事情

标签: mysql sql performance


【解决方案1】:

索引在这里非常重要。有很大的不同。还要确保它正确标准化。

另一个更实际的想法是没有一个大数据库。但是根据您以后查询时知道的标准,将它分成许多更小的。比如,日期,第一个字母等。让这个大数据库一直在增长是不切实际的。必须分开。

另一个部门可能是将旧数据存储在速度较慢的大块中。在临时表中保存较新使用的数据。

【讨论】:

  • 相当简单,有处理大数据的“方法”
  • 是的。只是一些粗略的建议。当然,关于这个主题还有很多话要说……如果它是一个需要处理大负载的大项目,则应首先研究最佳方法。但这可能处于另一个“发展水平”。
【解决方案2】:

如果您有这么大的表并且您感兴趣的值是“最新的”,那么您可以使用 MySQL partitioning 提高性能。更多您可以查看此article

【讨论】:

    【解决方案3】:

    索引是这里故事的一部分..

    尽量避免 LIMIT 的开头和结尾。 如果您使用 LIMIT 1000000, 30 mysql 服务器需要在内存中保留 1000030 条记录,因此再次丢弃 1000000 条记录以保留 30 非常浪费资源,特别是当 mysql 应该在磁盘上创建临时表时,当内存表变为大...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      相关资源
      最近更新 更多