Php 如何使用RAND()优化慢速SQL语句

Php 如何使用RAND()优化慢速SQL语句,php,random,Php,Random,我目前正在从事一个项目,该项目有一个非常大的用户数据库及其不同级别的数据库,但是我们正在使用RAND(),并且由于数据库需求的增长,我们的web主机开始发出非常高的MySQL CPU使用警告 因此,我们需要优化这一特定查询,以帮助减少mysqli调用 存储大部分数据的行链接接近50000多个条目,使用RAND()正在慢慢扼杀网站 我们将如何对此进行优化以减少mysqli调用的数量 $CALLROW = $db->CacheGetAll("SELECT `ID`, `TITLE` FROM

我目前正在从事一个项目,该项目有一个非常大的用户数据库及其不同级别的数据库,但是我们正在使用RAND(),并且由于数据库需求的增长,我们的web主机开始发出非常高的MySQL CPU使用警告

因此,我们需要优化这一特定查询,以帮助减少mysqli调用

存储大部分数据的行链接接近50000多个条目,使用RAND()正在慢慢扼杀网站

我们将如何对此进行优化以减少mysqli调用的数量

$CALLROW = $db->CacheGetAll("SELECT `ID`, `TITLE` FROM `{$tables['link']['name']}` WHERE (`FEATURED` = '1' OR `FEATURED_ADVANCED`= '1' OR `FEATURED_NORMAL`= '1') AND `STATUS` = '2' {$expire_where} ORDER BY RAND() LIMIT 20");
$tpl->assign('CALLROW', $CALLROW);

如何减少上述SQL语句上的内存印记?

在尝试了一个错误后,我得出了这个结论

$CALLROW = $db->CacheGetAll("SELECT * FROM `{$tables['link']['name']}` WHERE `FEATURED` = '1' OR `FEATURED_ADVANCED`= '1' OR `FEATURED_NORMAL`= '1' AND `STATUS` = '2' AND ID >= RAND() * (SELECT MAX(ID) FROM `{$tables['link']['name']}`) LIMIT 15");
$tpl->assign('CALLROW', $CALLROW);
然而,在我刷新之后,它会拉一些不同的ID,但不会拉特色的高级或特色的普通ID,它似乎只会先拉特色的ID


试错之后,我想出了一个办法,你知道如何真正地洗牌吗

$CALLROW = $db->CacheGetAll("SELECT * FROM `{$tables['link']['name']}` WHERE `FEATURED` = '1' OR `FEATURED_ADVANCED`= '1' OR `FEATURED_NORMAL`= '1' AND `STATUS` = '2' AND ID >= RAND() * (SELECT MAX(ID) FROM `{$tables['link']['name']}`) LIMIT 15");
$tpl->assign('CALLROW', $CALLROW);
然而,在我刷新之后,它会拉一些不同的ID,但不会拉特色的高级或特色的普通ID,它似乎只会先拉特色的ID


任何关于如何真正洗牌这些的想法

看看这个答案,我似乎仍然无法得到它,因为我是php新手fairley。任何帮助都将不胜感激,我提前感谢任何人。您可以创建一个新的排序列,并使用后台进程在该字段中为所有行写入随机数。那么,按该字段进行排序的时间成本会低得多。你能提供一个例子吗?有人能给我们一个更好的sql查询的例子吗,然后是上面的一个吗?检查这个答案,我似乎仍然无法得到它,因为我是php的新手。任何帮助都将不胜感激,我提前感谢任何人。你可以创建一个新的排序列并使用后台进程在该字段中为所有行写入随机数。那么,按该字段排序的时间开销会小得多。你能提供一个例子吗?有人能给我们一个比上面的更好的sql查询的例子吗?我似乎仍然无法让他们真正地洗牌结果。。。它确实随机选择,但它似乎从来没有抓取特色的\u普通或特色的\u高级的任何建议?我似乎仍然无法让他们真正洗牌的结果。。。它是随机选择的,但它似乎从来没有抓住特色的普通或特色的高级的任何建议?