首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改进MySQL随机

改进MySQL随机
EN

Stack Overflow用户
提问于 2014-02-17 13:12:54
回答 5查看 107关注 0票数 1

我有一个疑问:

代码语言:javascript
复制
$sql = "SELECT 
    catalogs_values.name as word, catalogs.name as catalog
FROM
    catalogs_values
        INNER JOIN
    catalogs ON catalogs_values.catalog_id = catalogs.id
WHERE
    catalogs_values.id NOT IN (SELECT 
            valueid
        FROM
            monitor
        WHERE
            userid = $user_id)
        AND catalogs_values.checked = 0
ORDER BY RAND()
LIMIT 1";

在我的表中,我有大约100万条记录,我的查询非常慢。你能提出一些改进的建议吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-02-17 13:20:24

尝试将not in替换为left outer joinnot exists

代码语言:javascript
复制
SELECT cv.name as word, c.name as catalog
FROM catalogs_values cv INNER JOIN
     catalogs c
     ON cv.catalog_id = c.id LEFT JOIN
     monitor m
     on cv.id = m.valueid and userid=$user_id
WHERE m.valueid is null and cv.checked = 0
ORDER BY RAND()
LIMIT 1;

这可能会解决性能问题。

如果没有,您可能需要另一种方法来获得随机行。一种简单的方法是选择随机行的子集,然后只选择一个:

代码语言:javascript
复制
select word, catalog
from (SELECT cv.name as word, c.name as catalog
      FROM catalogs_values cv INNER JOIN
           catalogs c
           ON cv.catalog_id = c.id LEFT JOIN
           monitor m
           on cv.id = m.valueid and userid=$user_id
      WHERE m.valueid is null and cv.checked = 0 and rand() < 0.001
     ) t
ORDER BY RAND()
LIMIT 1;

内部查询选择大约1/1000行(比例可能需要更改,这取决于与各种其他条件匹配的行数)。然后将这个简化的集合传递给order by rand()方法,以便只选择一个。

票数 0
EN

Stack Overflow用户

发布于 2014-02-17 13:16:21

Mysql的RAND排序总是很慢,我使用一种非常快速的方法来排序:

  1. 从表中选择min和max ID
  2. 运行php (min_Id,max_Id)
  3. 做一个循环,直到你找到一个真正存在的id,相信我,如果id是一个唯一的键,它是非常快的。
  4. 一旦确定ID存在,退出循环,就有了随机ID。 $SQL =“从表中选择最大( id )为x ";$query = mysql_query( $SQL );$x = mysql_fetch_assoc($query);$max = $x'x';$ok = false;$ok($ok == false){ $id = rand(1,$max);$SQL=”从表中选择id =“.$id”。限制1";$query = mysql_query($SQL);$record = mysql_fetch_assoc($query);if((Int)$record‘> 0){ $ok = true;}//您的ID是:$record’ID‘>;
票数 1
EN

Stack Overflow用户

发布于 2014-02-17 13:30:36

MediaWiki (想想维基百科的随机文章页)是这样做的:为每一行分配一个随机值,将其添加到索引中,然后使用索引选择:

代码语言:javascript
复制
SELECT * from `some_table` where `my_rand_column` >= RAND() LIMIT 1;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21830041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档