Производительность DISTINCT vs array_unique()
На php.com.ua прочитал высказывание, что при выборке большого количества строк с уникальным значением одного столбца лучше использовать PHP для отбрасывания повторяющихся значений.
Конечно же, я сразу знал что это не так и эксперимент это подтвердил.
Система:
ОС: Windows 2003 ServerPHP: 5.2.3
MySQL: 5.0.24
Результаты эксперимента:
MySQL DISTINCT query
-----------------------
Different names : 10902
Time: 6.1886458396912
-----------------------
PHP
-----------------------
Different names : 10902
Time: 37.368453979492
Исходные данные:
В таблице было 1000000 строк, в поле name каждой из них - трехбуквенное значение сгенерированное случайным образом.
Таблица:
- CREATE TABLE `test` (
- `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
- `name` varchar(45) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=latin1
Скрипт:
Построим индекс
Пойдем чуть дальше и построим индекс по столбцу `name`. Это должно дать неплохое уменьшение времени выполнения в случае DISTINCT. Справедливости ради нужно сказать, что само построение индекса для миллиона записей занимает достаточно много времени.
- ALTER TABLE `test`.`test` ADD INDEX `name_index`(`name`);
После этого выполняя тот самый скрипт - получаем результат:
MySQL DISTINCT query
-----------------------
Different names : 10902
Time: 0.42639398574829
-----------------------
PHP
-----------------------
Different names : 10902
Time: 33.1578975632147
Выводы
В данной лабораторной работе мы лишний раз убедились в том, что язык SQL, который специально предназначен для работы с реляционными БД значительно выигрывает в производительности у языка PHP при выполнении вышеописанной задачи - получения выборки уникальных значений.
А добавление индекса оставляет PHP далеко позади в этом вопросе и заставляет его нервно курить в коридоре. :-)








— Author: vedeney · 2008-02-15 11:11 · #
как по мне, так тест не очень чесный :)
выполнять array_unique после того как куча памяти и ресурсов процесора были загружены задачей SQL сервера :)
Но соглашусь, что в любом случае SQL будет в разы быстрее чем array_unique а с индексом и подавно :)
— Author: Сотомайор · 2008-02-15 11:43 · #
Не думаю, что это сильно повлияло.
1. array_unique выполнялся после простого запроса SELECT, а не с DISTINCT;
2. Памяти на системе вполне достаточно, да и PHP ведь ограничен в используемой памяти, он никогда не подгребает всю свободную;
3. Запрос и array_unique() идут последовательно, поэтому процессор уже освободится к тому моменту от выполнения запроса;
4. Сделал тест с задержкой 10 секунд перед array_unique() чтобы систему “попустило” и освободились ресурсы. Результат практически такой же. Без задержки даже на 0.1 секунды быстрее получилось.
— Author: dusoft · 2008-02-15 11:56 · #
Я думаю що тест доволі чесний, бо треба було визначити скільки часу забере отримання результату одним методом і іншим. В реальній ситуації при використанні другого методу ми ж не беремо дані з повітря. Простіше порівнювались же не швидкості алгоритмів які використовує MySQL і того алгоритму який було використано в другому варіанті, а порівнювався час необхідний на досягнення результату, і в другому випадку ми не можемо знехтувати операцією отримання даних з БД.