ORDER BY RAND()会全表扫描怎么优化
时间: 2023-12-05 07:04:26 浏览: 97
oracle全表扫描的3种优化手段
3星 · 编辑精心推荐
在 MySQL 中,使用 ORDER BY RAND() 会导致全表扫描,因为 MySQL 需要计算每一行的随机值,然后按照这个随机值排序,这个过程需要扫描整个表。这对于大表来说会非常慢。
以下是一些优化 ORDER BY RAND() 的方法:
1. 使用子查询,先生成一个随机数列,然后再根据这个数列进行排序。例如:
```
SELECT * FROM (
SELECT *, RAND() as rand_num
FROM table_name
) as t
ORDER BY rand_num
```
2. 使用随机数列表,预生成一个随机数列表,然后在查询时使用这个表进行排序。例如:
```
CREATE TABLE rand_nums (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, rand_num FLOAT);
INSERT INTO rand_nums (rand_num) VALUES (RAND()), (RAND()), ....;
SELECT t.*
FROM table_name t
JOIN rand_nums r
ORDER BY r.rand_num
LIMIT 10;
```
3. 限制结果集的大小,只获取需要的随机行数。例如:
```
SELECT * FROM table_name
ORDER BY RAND()
LIMIT 10;
```
这样虽然仍然需要全表扫描,但是只需要获取前 N 行即可,可以明显减少运算量。
阅读全文