我有一个约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

10-06 01:49