0

我有以下要优化的简单查询:

SELECT a.id, a.name AS nam
FROM ghost a
WHERE a.name NOT 
IN (
SELECT ghost
FROM users
)
ORDER BY RAND( ) 
LIMIT 1

这个查询现在需要 5 秒来执行,因为 ghost 表有 1200 个名称记录。请如果有人有优化方式来执行这个查询,因为我想在幽灵表中添加更多的名字,所以它会比现在大得多。但是,如果查询现在需要很多时间,那么如果我添加更多记录,那对我来说将是地狱般的情况......

下面是两个表的结构: 在此处输入图像描述 在此处输入图像描述

4

1 回答 1

0

可能尝试将其重写为连接,但 ORDER BY RAND() 会更加损害性能

SELECT a.id, a.name AS nam
FROM ghost a
LEFT OUTER JOIN users b
ON a.name = b.ghost
WHERE b.ghost IS NULL
ORDER BY RAND( ) 
LIMIT 1

users 表是否在 ghost 列上有索引?

要消除 RAND 的订单,您可以尝试以下操作:-

SELECT a.id, a.name AS nam
FROM ghost a
INNER JOIN 
(
    SELECT RAND( ) * ( MAX( z.id ) - MIN( z.id ) ) + MIN( z.id ) AS id
    FROM ghost z
    LEFT OUTER JOIN users y
    ON z.name = b.ghost
    WHERE y.ghost IS NULL
) r2
ON a.id >= r2.Id
LEFT OUTER JOIN users b
ON a.name = b.ghost
WHERE b.ghost IS NULL
ORDER BY a.id ASC
LIMIT 1
于 2013-07-09T15:32:27.127 回答