选择where语句为long的随机行

时间:2018-03-13 14:21:01

标签: mysql sql

我想选择一个带有特定where语句的随机行,但查询需要很长时间(约2.7秒)

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

数据库包含大约900k行

由于

1 个答案:

答案 0 :(得分:2)

SELECT * FROM PIN WHERE available = '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-set,然后从该结果中选择一个随机数:

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])