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

php – 为什么MySQL在SELECT语句中使用RAND()时会返回相同的结果

发布时间:2020-12-13 17:26:19 所属栏目:PHP教程 来源:网络整理
导读:我打开了许多浏览器窗口,指向同一个自动刷新的 PHP页面.它访问MySQL数据库以识别过期的客户信息.特别是获取最近一天未更新的记录并强制更新.其余的代码似乎处理得很好. 这是我的MySQLi查询: $query = "SELECT * FROM customers WHERE customer_group='consu
我打开了许多浏览器窗口,指向同一个自动刷新的 PHP页面.它访问MySQL数据库以识别过期的客户信息.特别是获取最近一天未更新的记录并强制更新.其余的代码似乎处理得很好.

这是我的MySQLi查询:

$query = "SELECT *
          FROM customers
          WHERE customer_group='consumables' AND customer_updated < DATE_SUB(NOW(),INTERVAL 1 DAY)
          ORDER BY RAND()
          LIMIT 10";

我被告知RAND()不是很合适,因为它对大型表的处理速度很慢,但是在这个项目结束之前我的表不会增加到超过20000.我还有一个随机变量传递给URL,如“clientdataupdates.php?nocachepls = 1541231”.

所以这是我的问题:在当前的5000多条记录中,如果此脚本同时在多个浏览器窗口中运行,它们将从MySQL返回相同的记录.不可否认,所选记录似乎是随机选取的,但如果查询在同一时间运行,则在所有窗口中返回相同的记录.

我的研究受到以下事实的限制:我一直在寻找的关键词(现在几天)似乎与其他问题有关,例如“php mysql在使用rand()时返回相同的结果”有太多谷歌响应,指向一般使用rand().

虽然我仍然感谢任何帮助,但实际上我更想知道为什么会这样.我对MySQL内部工作原理的了解是有限的,但是就我在PHP和MySQL接口方面的经验而言,我还没有看到类似的事情.

更新:

我还测试了使用ajax函数,该函数包含一个回调函数来重新启动它.每次div内容都是相同的记录 – 但它仍然看起来像随机选择了哪个记录.

<div id='worker1' class='workerDiv'>worker: waiting..</div>
<div id='worker2' class='workerDiv'>worker: waiting..</div>
<div id='worker3' class='workerDiv'>worker: waiting..</div>
<div id='worker4' class='workerDiv'>worker: waiting..</div>
<div id='worker5' class='workerDiv'>worker: waiting..</div>
<script>
 function nextWorker(thisWorker){
  setTimeout(function(){ ajaxpage('customerdata_worker.php',thisWorker,nextWorker(thisWorker)); },10000);
 }
 setTimeout(nextWorker('worker1'),100);
 setTimeout(nextWorker('worker2'),100);
 setTimeout(nextWorker('worker3'),100);
 setTimeout(nextWorker('worker4'),100);
 setTimeout(nextWorker('worker5'),100);
</script>

解决方法

您可能正在从某些结果集中的MySQL查询缓存中接收信息.

试试这个:

SELECT SQL_NO_CACHE *
       /* etc */

注意:将SQL_NO_CACHE字放在与SELECT和*(或您选择的第一列的名称)相同的行上.

看到:http://dev.mysql.com/doc/refman/5.1/en/query-cache.html它说,

The query cache stores the text of a SELECT statement together with
the corresponding result that was sent to the client. If an identical
statement is received later,the server retrieves the results from the
query cache rather than parsing and executing the statement again. The
query cache is shared among sessions,so a result set generated by one
client can be sent in response to the same query issued by another
client.

专业提示:避免在软件中使用SELECT *.在结果集中提供所需列的名称.

(编辑:李大同)

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

    推荐文章
      热点阅读