数码资讯
MySQL查询随机数据的4种方法及性能比较
以下四种方案用于分析它们的优缺点。 方案1: 复制代码代码如下:SELECT * FROM `表` ORDER BY RAND()极限0.1; 这个方法的问题很慢,原因是MySQL会创建一个零时间表保存所有结果集,然后给每个结果一个随机索引,然后对它进行排序并返回它。 有几种方法可以解决这个问题。
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
以下四种方案用于分析它们的优缺点。
方案1:
复制代码代码如下:SELECT * FROM `表` ORDER BY RAND()极限0.1;
这个方法的问题很慢,原因是MySQL会创建一个零时间表保存所有结果集,然后给每个结果一个随机索引,然后对它进行排序并返回它。
有几种方法可以解决这个问题。
基本思想是先得到一个随机数,然后用随机数获取指定的行。
由于所有行都有唯一的ID,所以我们只在最小值和最大ID之间取随机数,然后将id作为行数。
为了获得整个表的最小和最大ID,我们使用max()和min()的两个聚合函数。这两种方法将返回指定组中的最大值和最小值。
方案二:
复制代码代码如下:< PHP
range_result美元= mysql_query(选择最大(` ID `)作为max_id,min(` ID `)作为min_id从);
range_row = mysql_fetch_object美元(美元range_result);
随机= mt_rand美元(美元range_row -> min_id,range_row美元-> max_id);
结果= mysql_query美元(SELECT * FROM `表`哪里` ID `美元随机极限> = 0,1);
正如我们前面提到的,该方法用唯一的ID值限制表的每一行,如果不是这样的话怎么办
以下的解决办法是使用mysql.limit限制条款接收两个参数,第一个参数指定的返回第一行的偏移量,和第二参数指定的最大行数返回结果。偏移指定的第一行是0而不是1。
为了计算第一行的偏移量,我们使用MySQL的rand()从0到1产生一个随机数的方法。然后我们乘数与倒排表记录得到的数()方法。由于极限参数必须是int而不浮,我们使用楼()处理results.floor()会计核算小于表达式的最大值。这是最后的代码:
方案三:
复制代码代码如下:< PHP
offset_result美元= mysql_query(选择地板(rand()*(*)计数)作为`偏移`从`表` );
offset_row = mysql_fetch_object美元(美元offset_result);
美元美元offset_row ->偏移偏移;
结果= mysql_query美元(SELECT * FROM `表`限制抵消1美元,);
在MySQL 4.1中,我们可以使用子查询合并上述两方法:
方案四:
将代码复制如下:从表中选择*(从id到表(max)(ID)*伦德(从))表按ID限制为1;
该方案与方案二相同,仅适用于具有唯一id值的表。
还记得我们最初寻找随机行、速度的替代方法的原因吗!那么,这些方案的执行时间是如何比较的呢我不会指出硬件和软件配置或者给出具体的数字:
最慢的是解决方案之一(我们假设它需要100%的时间)。
方案二使用79%
方案三u2013 13%
方案四u2013 16%
所以,计划三赢!
方案1:
复制代码代码如下:SELECT * FROM `表` ORDER BY RAND()极限0.1;
这个方法的问题很慢,原因是MySQL会创建一个零时间表保存所有结果集,然后给每个结果一个随机索引,然后对它进行排序并返回它。
有几种方法可以解决这个问题。
基本思想是先得到一个随机数,然后用随机数获取指定的行。
由于所有行都有唯一的ID,所以我们只在最小值和最大ID之间取随机数,然后将id作为行数。
为了获得整个表的最小和最大ID,我们使用max()和min()的两个聚合函数。这两种方法将返回指定组中的最大值和最小值。
方案二:
复制代码代码如下:< PHP
range_result美元= mysql_query(选择最大(` ID `)作为max_id,min(` ID `)作为min_id从);
range_row = mysql_fetch_object美元(美元range_result);
随机= mt_rand美元(美元range_row -> min_id,range_row美元-> max_id);
结果= mysql_query美元(SELECT * FROM `表`哪里` ID `美元随机极限> = 0,1);
正如我们前面提到的,该方法用唯一的ID值限制表的每一行,如果不是这样的话怎么办
以下的解决办法是使用mysql.limit限制条款接收两个参数,第一个参数指定的返回第一行的偏移量,和第二参数指定的最大行数返回结果。偏移指定的第一行是0而不是1。
为了计算第一行的偏移量,我们使用MySQL的rand()从0到1产生一个随机数的方法。然后我们乘数与倒排表记录得到的数()方法。由于极限参数必须是int而不浮,我们使用楼()处理results.floor()会计核算小于表达式的最大值。这是最后的代码:
方案三:
复制代码代码如下:< PHP
offset_result美元= mysql_query(选择地板(rand()*(*)计数)作为`偏移`从`表` );
offset_row = mysql_fetch_object美元(美元offset_result);
美元美元offset_row ->偏移偏移;
结果= mysql_query美元(SELECT * FROM `表`限制抵消1美元,);
在MySQL 4.1中,我们可以使用子查询合并上述两方法:
方案四:
将代码复制如下:从表中选择*(从id到表(max)(ID)*伦德(从))表按ID限制为1;
该方案与方案二相同,仅适用于具有唯一id值的表。
还记得我们最初寻找随机行、速度的替代方法的原因吗!那么,这些方案的执行时间是如何比较的呢我不会指出硬件和软件配置或者给出具体的数字:
最慢的是解决方案之一(我们假设它需要100%的时间)。
方案二使用79%
方案三u2013 13%
方案四u2013 16%
所以,计划三赢!
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。