加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 从大表中获取随机结果

发布时间:2020-12-13 16:47:16 所属栏目:PHP教程 来源:网络整理
导读:我试图从一个包含大约700万条记录的表中获得4个随机结果.另外,我还希望从同一个表中获得按类别过滤的4个随机记录. 现在,正如您所想象的那样,对表进行随机排序会导致查询花费几秒钟,这并不理想. 我想到的另一种非过滤结果集的方法是让PHP选择1到7,000,000之间
我试图从一个包含大约700万条记录的表中获得4个随机结果.另外,我还希望从同一个表中获得按类别过滤的4个随机记录.

现在,正如您所想象的那样,对表进行随机排序会导致查询花费几秒钟,这并不理想.

我想到的另一种非过滤结果集的方法是让PHP选择1到7,000,000之间的一些随机数,然后用查询做一个IN(…)来抓取那些行 – 和是的,我知道这种方法有一个警告,如果具有该id的记录不再存在,则可能会少于4.

但是,上述方法显然不适用于类别过滤,因为PHP不知道哪个记录号属于哪个类别,因此无法选择要选择的记录号.

有没有更好的方法可以做到这一点?我能想到的唯一方法是将每个类别的记录id存储在另一个表中,然后从中选择随机结果,然后在辅助查询中仅从主表中选择那些记录ID;但我相信有更好的方法!?

解决方法

当然,您可以使用LIMIT和WHERE(对于类别)对查询使用RAND()函数.然而,正如您所指出的那样,需要扫描数据库,这需要时间,特别是在您的情况下,由于数据量的原因.

另外,正如您所指出的,将id / category_id存储在另一个表中的其他替代方案可能会更快一些,但同样必须在该表上有一个LIMIT和WHERE,它还包含与主表相同数量的记录.

另一种方法(如果适用)是每个类别有一个表并存储ID.如果您的类别是固定的或不经常更改,那么您应该能够使用该方法.在这种情况下,您将有效地从子句中删除WHERE,并且在每个类别表上获得带有LIMIT的RAND()会更快,因为每个类别表将包含主表中的记录子集.

其他一些替代方法是仅为该操作使用键/值对数据库. MongoDb或Google AppEngine可以提供帮助并且非常快.

您也可以在MySQL中使用Master / Slave.从站实时复制内容,但是当您需要执行昂贵的查询时,您将查询从站而不是主站,从而将负载传递给其他计算机.

最后你可以使用Sphinx,它更容易安装和维护.然后,您可以将每个类别查询视为文档搜索,并让Sphinx随机化结果.这样你就可以将这个昂贵的操作偏移到另一个层,让MySQL继续进行其他操作.

只是要考虑一些问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读