mysql - 选择一个随机行,其中 where 语句花费的时间太长

标签 mysql sql

我想选择具有特定 where 语句的随机行,但查询时间很长(大约 2.7 秒)

SELECT * FROM PIN WHERE available = '1' ORDER BY RAND() LIMIT 1

数据库包含大约 90 万行

谢谢

最佳答案

从可用的 PIN 中选择 * = '1' ORDER BY RAND() LIMIT 1

意味着您将为每一行生成一个随机数,然后对整个结果集进行排序,最后检索一行。

查询单行需要大量工作。

假设您的 id 没有间隙 - 或者只有很少的间隙 - 您最好使用您正在使用的编程语言来生成一个随机数 - 并获取该 id:

伪示例:

result = null;
min_id = queryMinId();
max_id = queryMaxId();
while (result == null){
  random_number = random_beetween(min_id, max_id);

  result = queryById(randomNumber);
}

如果有很多间隙,您可以检索整个 id 集,然后从之前的结果中选择一个随机数:

id_set = queryAllIds();
random_number = random_beetween(0, size(id_set)-1);

result = queryById(id_set[random_number])
<小时/>

第一个示例无需额外限制即可运行。在您的情况下,您应该使用选项 2。这可以确保所有具有 available=1 的 ID 都被预先选入 0count() -1 数组,因此忽略所有无效的 id。

然后,您可以生成 0count() -1 之间的随机数,以获取该结果集中的 index,其中您可以将其转换为最终要获取的实际 ID。

id_set = queryAllIdsWithAvailableEqualsOne(); //"Condition"
random_number = random_beetween(0, size(id_set)-1);

result = queryById(id_set[random_number])

关于mysql - 选择一个随机行,其中 where 语句花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49258609/

相关文章:

MySQL 选择带有 JSON 值的最后一个键

php - 如果发现重复值,将数组添加在一起?

php - 选择从字段 3 到字段 4 的唯一行

mysql - 保留前 3 位小数

mysql - mysql中从多个表插入到一个表

php - MySQLi 查询不起作用,语法正确吗?

mysql - select rows mysql order by 自定义值 从表底部到表顶部

php - MySQL 查询不返回任何内容

mysql - MySQL改变单列格式的方法

sql - 试图构造一个SQL查询麻烦