编程语言
首页 > 编程语言> > php – 从大表中获取随机结果

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

作者:互联网

我试图从一个包含大约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继续进行其他操作.

只是要考虑一些问题.

标签:php,mysql,large-data-volumes
来源: https://codeday.me/bug/20190630/1331743.html