2013-07-14 43 views
1

因此,我有一个MYSQL数据库,其中一个表每秒增长5,000行。我希望这张表能够进入数十亿条记录。我现在所拥有的PHP中的查询功能:MYSQL查询十亿条记录和超时问题

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

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

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

此外,我不死在使用PHP,如果有更快的选择请让我知道。

将表拆分成多个表并同时在多个小表上运行查询会更好吗?

谢谢您的高级。

+2

你有索引吗?你的查询没有'ORDER BY'子句,所以MySQL会猜测如何对记录进行排序,并且很可能使_wrong_猜测。在索引列上添加一个ORDER BY,没有一个顺序不是确定性的。 –

+2

我还会补充说'SELECT *'几乎从不属于生产代码。尽管它不应该减慢查询速度,但它可能会影响MySQL选择排序的列。始终明确您实际需要的列。 –

+0

您可以尝试对'data'列建立索引,但这会通过更新每个INSERT的索引来降低更新速度。你也许可以通过使用INSERT DELAYED来减轻这个问题,或者缓冲你的输入,并用一个'INSERT'语句添加大块更新。 – 2013-07-14 21:58:50

回答

3

索引在这里非常重要。造成巨大的差异。还要确保它正确地正常化。

另一个更多的想法是,没有一个大分贝。但根据您稍后查询时所了解的标准将其分成许多较小的标准。像日期,首字母等等。让这个大分贝一直在增长是不现实的。它必须分开。

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

+0

相当简单,有'方法'来处理大数据 – 2013-07-14 22:06:41

+0

是的。只是一些粗糙的建议。关于这个问题还有很多话要说,自然而然......如果这是一个需要处理大负荷的大项目,那么应该首先研究最好的方法。但那可能是另一个“发展水平”。 –

1

如果你有这么大的一张表,你感兴趣的值是“最新”的,你可以使用MySQL partitioning提高性能。更多你可以检查这个article

1

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

尽量避免LIMIT开始和结束。 如果你使用LIMIT 1000000,那么mysql服务器需要在内存中保存1000030条记录,所以它非常浪费资源来丢弃1000000条记录以保持30,特别是当mysql应该在磁盘上创建一个临时表时,这将会发生在内存表变得很大...