Php 如何进行数百万数据选择

Php 如何进行数百万数据选择,php,mysql,database-performance,Php,Mysql,Database Performance,我有一个为所有客户存储特定更新的表 一些示例表: 记录| id |客户| id |单位| id |时间|戳记|数据1 |数据2 |数据3 |数据4 |更多 当我创建这个应用程序时,我没有意识到这个表会增长多少——目前我在一个月内有超过10mil的记录。当php由于所花费的时间而停止执行时,我面临着一些问题。有些查询根据时间戳+客户id+单位id生成排名前1的结果 您建议如何处理此类问题?例如,我可以为每个客户创建新表,尽管我认为这不是一个好的解决方案 我脑子里没有好的解决方案。表中的记录数是多少

我有一个为所有客户存储特定更新的表

一些示例表:

记录| id |客户| id |单位| id |时间|戳记|数据1 |数据2 |数据3 |数据4 |更多

当我创建这个应用程序时,我没有意识到这个表会增长多少——目前我在一个月内有超过10mil的记录。当php由于所花费的时间而停止执行时,我面临着一些问题。有些查询根据时间戳+客户id+单位id生成排名前1的结果

您建议如何处理此类问题?例如,我可以为每个客户创建新表,尽管我认为这不是一个好的解决方案


我脑子里没有好的解决方案。

表中的记录数是多少?通常,对于关系数据库,重要的不是你有多少数据,而是你如何检索数据

事实上,从select的外观来看,您可能只需要优化语句本身并避免多个子select,这可能是导致速度减慢的主要原因。尝试对该语句运行explain,或者只获取ID并对第一次运行中实际找到和检索到的记录的ID分别运行内部select

事实上,您的整个语句中包含了这些子选择,这意味着您在流程中还没有进行优化。例如,您可以运行每晚或每小时一次的cron作业,将集合聚合到一个新表中,如SELECT gps_unit.idgps_unit创建的集合,然后您可以针对先前生成的表运行SELECT,而不是创建与表相当的数据块

如果您发现自己无法有效地优化select语句,您可以选择以下最终选项:

通过一些标准进行分类并分为不同的表。 保留一个深度存档,这样,第一年左右的任何内容都会迁移到使用较少的表中,并且需要进行特殊检索。 最后,如果您有这么多的小数据,您可能能够完全归档某些表,并仅以文件形式保留它们,然后在某个日期之后截断它们。通常情况下,网络跟踪数据并不重要,而且有点垃圾,几年后我就这样做了,而这些数据真的对任何人都没有任何好处。
我建议您按照一些标准对数据进行分区

您可以对数据进行水平或垂直分区

例如,使用客户id模块10将客户id分组到10个分区中

因此,在0中终止的customer_id进入分区0,在1中终止的customer_id进入分区1


为您提供方便。

如果您在云上,在服务器和数据库之间移动数据需要付费,请忽略

将所有逻辑移到服务器上

最快的查询是选择主查询的位置。不管你的数据库有多大,只要你的硬件不是不平衡的,它会以同样快的速度返回一个1行的表

我不能确切地告诉您正在对查询执行什么操作,但首先将所有排序和限制数据下载到PHP中。一旦您获得了所需的内容,请直接选择记录id上的数据,我假定这是您的主要数据

看起来您的随需应变数据在计算上非常密集和庞大,因此我建议使用更快的语言

此外,当您开始在服务器而不是数据库上进行排序和限制时,您可以开始识别快捷方式以进一步加快排序和限制


这就是服务器的作用。

将表结构与检索数据的SQL一起粘贴到您已经拥有的部分。