Внедрение в PHP против встраивания в MySQL - который использует меньше процессоров? - PullRequest
4 голосов
/ 11 мая 2011

Какой из этих вариантов более оптимален?

взрыва в MySQL

$rsFriends = $cnn->Execute('SELECT CAST(GROUP_CONCAT(id_friend) AS CHAR) AS friends 
                              FROM table_friend 
                             WHERE id_user = '.q($_SESSION['id_user']));
$friends = $rsFriends->fields['friends'];
echo $friends;

против

Внедрение в PHP

$rsFriends = $cnn->Execute('SELECT id_friend 
                              FROM table_friend 
                             WHERE id_user = '.q($_SESSION['id_user']));
while(!$rsFriends->EOF) {
    $friends[] = $rsFriends->fields['id_friend'];
    $rsFriends->MoveNext();
}
echo implode(',',$friends);

Ответы [ 3 ]

4 голосов
/ 11 мая 2011

Вы, вероятно, должны знать, что правильный («наиболее оптимальный») выбор будет зависеть от многих переменных:

  1. Ваша база данных и аппаратное обеспечение приложения.
  2. Размерваших данных
  3. Какая нагрузка уже есть на серверах баз данных и приложений.
  4. Индексы и другие вещи, которые могут повлиять на план выполнения запросов для вашего набора данных
  5. Как вы на самом деле хотят использовать данные.
  6. Сетевая задержка между сервером приложений и сервером базы данных

Но вы определенно можете проанализировать поток программы, чтобы помочь вам получить ответ:

Внедрение в PHP :

  1. Выполнение запроса выбора, возвращающего ВСЕ идентификаторы друзей
  2. Возвращение каждого отдельного идентификатора вашему приложению.
  3. Построение строки в PHP, когда вы читаете их из результата.

Плюсы:

  • Гибкость в использовании необработанных идентификаторов, если они вам действительно нужны(имеется в виду - если вы идете с созданием строки в MySQL, но постобработка в PHP, дорогостоящие постпроцессные операции, скорее всего, сведут на нет выгоду от обхода PHP на этапе компиляции строк)
  • идентификаторы могут быть (есть?) Возвращены в ваше приложение в виде чисел, а не строки (1234567890 - это 10 байтов ASCII, 4 байта как 32-битное целое)

Внедрение в MySQL :

  1. Выполнитьагрегированный запрос
  2. Создание строки при агрегировании результатов
  3. Возвращение одной единственной строки в ваше приложение
  4. Вывод этой строки

Плюсы:

  • Может потреблять меньше памяти на сервере базы данных для больших наборов данных
  • Не могу придумать больше ничего.Как только вам понадобится что-то, кроме большой объединенной строки, это решение определенно будет неоптимальным.
3 голосов
/ 11 мая 2011

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

Специально для вашего случая, если вы не анализируете или не манипулируете результатами, то есть это строгообъединить все записи вместе для вывода - тогда я определенно проголосую за базу данных.

1 голос
/ 11 мая 2011

Что, пожалуй, больше всего стоит оптимизировать, так это время и усилия разработчика для внедрения и обслуживания. Разница в циклах ЦП (как доля от всей выполняемой работы), скорее всего, тривиальна. Я предлагаю вам делать это любым удобным для вас способом, писать, тестировать и поддерживать.

...