[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как исключить запись одинаковых значений в базу, у
Страницы: 1, 2, 3, 4, 5, 6
twin
Кстати, если взять за догму, что записи не будут удаляться, у моего последнего варианта есть возможность получить значение без запроса. Но это уже действительно говнокод получится.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
И насчет обоснования. Вытаскивать миллион значений и проверять их на стороне PHP... Мсье знает толк в извращениях. smile.gif Просто может оперативки не хватить.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
volter9
sergeiss и Valick, вместо того что бы ругать twin'а за его вариант в цикле, лучше бы произвели бы benchmark.

Я попробовал сделать benchmark для своих вариантов и twin'а.
В конце концов вариант twin'а быстрее моего первого во много раз, к тому же вариант вырастает геометрически быстро.
Мой второй вариант быстрее варианта twin'а в 1.1 раз, но нужно знать последний id (держать в кэше к примеру).

Вот код короче:

<?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


sergeiss и Valick, можете добавить свои варианты ;)

P.S.: Хороший способ получить более оптимальное решении это устроить холивар :D

_____________
Мой блог
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.