我有一个约528829行的表,它看起来像
CREATE TABLE `ips` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`ip` INTEGER NOT NULL DEFAULT NULL,
`scantime` INTEGER NULL DEFAULT NULL,
`pingable` INTEGER NULL DEFAULT NULL
);
现在,我需要找到
ip
中不存在的第一个数字,从0开始到4294967295(aka 0xFFFFFFFF),目前我只是用
function isScanned($ip){
static $isScannedStm=false;
static $boundip=0;
if($isScannedStm===false){
global $db;
$isScannedStm=$db->prepare('SELECT 1 FROM `ips` WHERE `ip` = :ip LIMIT 1');
$isScannedStm->bindParam(':ip',$boundip,PDO::PARAM_INT);
return isScanned($ip);
}
$boundip=$ip;
$isScannedStm->execute();
//var_dump($isScannedStm->fetch(PDO::FETCH_NUM));
return !!($isScannedStm->fetch(PDO::FETCH_NUM));
}
//~~~
while(isScanned($i)){
++$i;
}
..它可以工作,但是有528829行,在我的Intel Atom C2750 @ 2.4GHz上需要1小时30分钟。.我如何更快地找到该值?最好快得多?
最佳答案
我只在MySQL中测试过,希望它也适用于SQLite
SELECT ips.ip+1 AS Missing
FROM ips
LEFT JOIN ips AS next ON ips.ip+1 = next.ip
WHERE next.ip IS NULL
ORDER BY ips.ip LIMIT 1;
Caspar和splattru的解决方案:https://stackoverflow.com/a/6464763/1078488