php и MySQL: 2 запроса или 1 запрос? - PullRequest
0 голосов
/ 22 января 2009

Я строю веб-страницу в php, используя MySQL в качестве базы данных.

Какой путь быстрее?

  1. 2 запроса к MySQL с последующим запросом.

    ВЫБРАТЬ точки из данных;
    ВЫБЕРИТЕ сумму (баллы) ОТ данных;

  2. 1 запрос к MySQL. Сохраните результат во временном массиве и вычислите сумму в php.

    $ data = ВЫБРАТЬ точки ОТ данных;

РЕДАКТИРОВАТЬ - данные о 200-500 строках

Ответы [ 10 ]

5 голосов
/ 22 января 2009

Это действительно будет зависеть от множества различных факторов. Я бы рекомендовал попробовать оба метода и посмотреть, какой из них быстрее.

3 голосов
/ 22 января 2009

Поскольку Фил и Кибби ответили на это довольно эффективно, я хотел бы отметить, что преждевременная оптимизация - это плохая вещь (TM). Напишите, что для вас проще всего, и профиль, профиль, профиль.

2 голосов
/ 22 января 2009

Сколько данных мы говорим? Я бы сказал, что MySQL, вероятно, быстрее выполняет подобные операции в большинстве случаев.

Изменить: с типом данных, о которых вы говорите, это, вероятно, не будет иметь большого значения. Но базы данных, как правило, оптимизированы для таких запросов, а PHP - нет. Я думаю, что второй запрос к БД, вероятно, того стоит.

1 голос
/ 29 января 2009

Если вы выполняете два отдельных запроса, вам нужно следить за возможностью изменения данных между получением строк и их суммой. Пока не будет заметной проблемы с производительностью, я буду придерживаться собственного суммирования, чтобы поддерживать согласованность страницы.

1 голос
/ 29 января 2009

Я бы не беспокоился об этом, пока у меня не возникнет проблема с производительностью.

1 голос
/ 29 января 2009

Если вы хотите сделать это в одну строку, используйте промежуточный итог, например:

SET @ total = 0;
SELECT points, @total: = @ total + points AS RunningTotal ОТ данных;

0 голосов
/ 29 января 2009

Вы можете использовать союз следующим образом:

(выберите баллы, ноль как сумма из данных) объединение (выберите ноль, сумму (баллы) из группы данных по точкам);

Результат будет выглядеть примерно так:

  point                total
   2                    null
   5                    null
   ...
   null                  <strong>7</strong>
Вы можете понять, как справиться с этим.
0 голосов
/ 29 января 2009

Просто для удовольствия.

SELECT COUNT(points) FROM `data`
UNION
SELECT points FROM `data`

Первая строка будет суммой, следующие строки будут данными.

ПРИМЕЧАНИЕ. Объединение может быть медленным, но это вариант.

Также может принести больше удовольствия, и это поможет вам сортировать строки.

SELECT 'total' AS name, COUNT(points) FROM `data`
UNION
SELECT 'points' AS name, points FROM `data`

Затем выбираем через PHP

while($row = mysql_fetch_assoc($query))
{
    if($row["data"] == "points")
    {
        echo $row["points"];
    }

    if($row["data"] == "total")
    {
        echo "Total is: ".$row["points"];
    }
}
0 голосов
/ 22 января 2009

сделать это способом MySQL. пусть менеджер базы данных сделает свою работу. mySQL оптимизирован для таких задач

0 голосов
/ 22 января 2009

Общее правило эффективности для mySQL - стараться минимизировать количество запросов SQL. Каждый вызов базы данных добавляет накладных расходов и является «дорогостоящим» с точки зрения требуемого времени.

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

Но он может оптимизировать только отдельные запросы. Он не может проверить отношения между двумя различными операторами SQL и оптимизировать их.

В вашем примере 1 два оператора сделают два запроса к базе данных, и таблица будет отсканирована дважды.

Ваш пример 2, в котором вы сохраняете результат и самостоятельно вычисляете сумму, будет быстрее, чем 1. Это будет только один вызов базы данных, и цикл по данным в PHP для получения суммы будет быстрее, чем второй вызов базы данных. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...