我有以下想要优化的简单查询:
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个名称记录。如果有人有优化方式来执行这个查询,因为我想在ghost表中添加更多的名字,所以它会比现在大得多。但是如果查询现在需要花费很多时间,那么如果我添加更多记录,那对我来说将是完美的情况......
以下是两个表格的结构:
答案 0 :(得分: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列上有索引?
要通过兰德取消订单,您可以尝试以下方式: -
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