【发布时间】:2016-01-03 22:25:04
【问题描述】:
我有一个大约 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(又名 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 分钟。我怎样才能更快地找到这个值?最好快得多?
【问题讨论】:
-
如果这是您的实际代码,您的创建表
AUTOINCREMENT应该读作AUTO_INCREMENTdev.mysql.com/doc/refman/5.7/en/example-auto-increment.html。 -
@Fred-ii-nope,我使用 sqlite,在 SQLite 中,它的 AUTOINCREMENT ,他们无法就名称达成一致^^
-
啊,我不知道。谢谢(你的)信息。 (注)。
-
@JimL 如果您要发布答案,请不要发布重复内容。如果问题因此而关闭,那么没有其他人可以添加额外/替代答案以可能改进问题。这是一种垄断形式。如果我没记错的话,这不是你第一次这样做,也是在你发布答案一分钟后。
标签: php sql performance sqlite