我想从一张大桌子中选择一张随机记录。搜索完毕后,最终找到了两个解决方案;
一个:
select id from `table` where id = (floor(1 + rand() * 2880000));
b:
select id from `table` where id >= (floor(1 + rand() * 2880000)) limit 1;
但是,第一个(a)解决方案比第二个(b)慢得多,大约慢慢40倍。
执行多次后,我发现了一个更奇怪的问题。第一种解决方案可能会返回两条记录。
select id from `table` where id = (floor(1 + rand() * 2880000));
+---------+
| id |
+---------+
| 2484024 |
| 1425029 |
+---------+
2 rows in set (1.06 sec)
我的问题是:
我的MySQL版本:
mysql> show variables like "%version%";
+-------------------------+-------------------------+
| Variable_name | Value |
+-------------------------+-------------------------+
| innodb_version | 5.5.43 |
| protocol_version | 10 |
| slave_type_conversions | |
| version | 5.5.43-0ubuntu0.12.04.1 |
| version_comment | (Ubuntu) |
| version_compile_machine | x86_64 |
| version_compile_os | debian-linux-gnu |
+-------------------------+-------------------------+
7 rows in set (0.04 sec)
感谢您的帮助。
答案 0 :(得分:1)
你的两个问题的答案:
请查看this answer以获得更好的解决方案。
答案 1 :(得分:0)
SELECT
a.id
FROM
tableA a
INNER JOIN
(SELECT
(ROUND((RAND() * (MAX(id) - MIN(id))) + MIN(id)) - 1) r
FROM
tableA) x
WHERE
a.id > x.r
LIMIT 1;