我想选择一个带有特定where语句的随机行,但查询需要很长时间(约2.7秒)
SELECT * FROM PIN WHERE available = '1' ORDER BY RAND() LIMIT 1
数据库包含大约900k行
由于
答案 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都预先选择到0
到count() -1
数组,因此忽略所有无效的ID。
然后,您可以在0
和count() -1
之间生成一个随机数,以便在该结果集中获得index
,您可以将其转换为实际ID,您将转到最后取。
id_set = queryAllIdsWithAvailableEqualsOne(); //"Condition"
random_number = random_beetween(0, size(id_set)-1);
result = queryById(id_set[random_number])