_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

<?php
// Benchmarking
// Во избежания notice на >PHP5.2
date_default_timezone_set('Europe/Moscow');
/**
* Функция для проверки времени выполнения
*
* @param string $name
* @param Closure $callback
* @param int $n - Сколько раз
*/
function bench ($name, Closure $callback = null, $n = 2000) {
static $benchmarks = array();
if (!isset($benchmarks[$name])) {
$start = microtime(true);
while ($n) {
$callback($n);
$n --;
}
$benchmarks[$name] = microtime(true) - $start;
}
else {
return $benchmarks[$name];
}
}
// Подключение к База данных
$db = null;
try {
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch (PDOException $e) {
die('Ошибка: ' . $e->getMessage());
}
// Создание таблицы:
$db->query('DROP TABLE test');
$db->query('CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id9` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY (`id9`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;');
$db->query('TRUNCATE test');
// Варианты
// twin:
bench('twin', function () use ($db) {
do {
$statement = $db->query('INSERT IGNORE INTO test SET id9 = ' . rand(100000000, 999999999));
} while ($statement->rowCount() === 0);
});
echo 'Вариант twin\'а заняло ', bench('twin'), "\n";
$db->query('TRUNCATE test');
// volter9:
$db->query('INSERT INTO test (id9) VALUES (ROUND((RAND(0) * (999999999 - 100000000)) + 100000000))');
bench('volter9', function () use ($db) {
$db->query('INSERT INTO test (id9) SELECT ROUND((RAND(id) * (999999999 - 100000000)) + 100000000) FROM test ORDER BY id DESC LIMIT 1');
});
echo 'Вариант volter9\'а заняло ', bench('volter9'), "\n";
$db->query('TRUNCATE test');
// volter9 (2):
bench('volter92', function ($i) use ($db) {
mt_srand($i);
$db->query('INSERT INTO test (id9) VALUES (' . mt_rand(100000000, 999999999) . ')');
});
echo 'Вариант volter9\'а (2) заняло ', bench('volter92'), "\n";
$db->query('TRUNCATE test');
Вариант twin'а заняло 1.0566039085388
Вариант volter9'а заняло 5.1029181480408
Вариант volter9'а (2) заняло 0.90965580940247