我有一个疑问:
$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万条记录,我的查询非常慢。你能提出一些改进的建议吗?
发布于 2014-02-17 13:20:24
尝试将not in替换为left outer join或not exists
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;这可能会解决性能问题。
如果没有,您可能需要另一种方法来获得随机行。一种简单的方法是选择随机行的子集,然后只选择一个:
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()方法,以便只选择一个。
发布于 2014-02-17 13:16:21
Mysql的RAND排序总是很慢,我使用一种非常快速的方法来排序:
发布于 2014-02-17 13:30:36
MediaWiki (想想维基百科的随机文章页)是这样做的:为每一行分配一个随机值,将其添加到索引中,然后使用索引选择:
SELECT * from `some_table` where `my_rand_column` >= RAND() LIMIT 1;https://stackoverflow.com/questions/21830041
复制相似问题