При использовании SELECT * FROM table WHERE Id IN ( .. )
запросов с более чем 10000 ключами с использованием PDO с помощью команды prepare()/execute() производительность ухудшает ~ 10X больше, чем выполнение того же запроса с использованием mysqli с подготовленными операторами или PDO без использования подготовленных операторов.
Более странные детали:
-
Более типичные операторы SELECT, не имеющие предложения
WHERE Id IN( ..)
, выполняются отлично даже при 100K + строках.SELECT * FROM table WHERE Id
, например, быстро. -
Снижение производительности происходит после завершения подготовки()/execute() - полностью в
PDOStatement::fetch()
илиPDOStatement::fetchAll()
. Время выполнения запросов MySQL является крошечным во всех случаях - это не случай оптимизации MySQL. -
Разделение запроса 10K на 10 запросов с помощью клавиш 1K является выполнимым.
-
Использование mysql, mysqli с подготовленными инструкциями или PDO без подготовленных операторов является выполнимым.
-
PDO w/подготовленный занимает примерно 6 секунд в примере ниже, в то время как другие принимают ~ 0,5 с.
-
В нелинейном режиме становится все хуже, чем больше у вас ключей. Попробуйте ключи 100K.
Пример кода:
// $imageIds is an array with 10K keys
$keyCount = count($imageIds);
$keys = implode(', ', array_fill(0, $keyCount, '?'));
$query = "SELECT * FROM images WHERE ImageID IN ({$keys})";
$stmt = $dbh->prepare($query);
$stmt->execute($imageIds);
// until now, it been fast. fetch() is the slow part
while ($row = $stmt->fetch()) {
$rows[] = $row;
}