ネコと和解せよ

SQLiteでMAX関数とMIN関数を一緒に使ったら死ぬほど遅かった話

300万件ほどのデータのあるinteger型のidを格納するテーブルで、MAX(id)とMIN(id)を求めようとしたらとんでもない時間がかかった。
同じSELECTでMINとMAXを求めたのが悪いようだ。別に求めてUNIONでくっつけると問題なかった。理由はよくわからない。


テーブル

CREATE TABLE ids (tid integer,primary key(tid));

検証コード

$time_start = microtime(true);
for($i=0;$i<10;$i++){
    $stmt = $pdo->prepare("SELECT MAX(tid),MIN(tid) FROM ids");
    $stmt->execute();    
}
$time = microtime(true) - $time_start;
echo "{$time} 秒\n";


$time_start = microtime(true);
for($i=0;$i<10;$i++){
    $stmt = $pdo->prepare("SELECT MAX(tid) FROM ids UNION SELECT MIN(tid) FROM ids");
    $stmt->execute();    
}
$time = microtime(true) - $time_start;
echo "{$time} 秒\n";

結果

2.2598919868469 秒
0.00030899047851562 秒

これでデータの数を増やせるぞ♡