Объедините два запроса MySQL с помощью UNION или программно - PullRequest
1 голос
/ 15 мая 2009

У меня есть два запроса MySQL, которые оба вставляют данные в таблицу. Оба имеют следующий формат:

CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
)
SELECT `field1`, `field2`
WHERE `active` = 1

Единственные различия между этими двумя запросами заключаются в том, как определяются field1 и field2, и в незначительных различиях в условии условий. Оба запускают до 12K и более записей.

Теперь, что будет более эффективным:

A. Запустите оба запроса отдельно:

if (mysql_query($query1)) {
    return mysql_query($query2);
}
return false;

B. ИЛИ объедините два запроса с помощью UNION и выполните один раз:

$query = 'SELECT `field1`, `field2` WHERE `active` = 1
            UNION 
            SELECT DO_ONE(`field1`), DO_TWO(`field2`) WHERE `active` = 1
            ORDER BY `field1`';
return mysql_query('CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
) ' . $query)

Данные из одного запроса бесполезны без данных из другого, поэтому оба должны быть успешными. DO_ONE и DO_TWO - это определенные пользователем функции MySQL, которые изменяют данные поля в соответствии с некоторыми спецификациями.

Ответы [ 3 ]

1 голос
/ 15 мая 2009

Ответ Aaronmccall, вероятно, является лучшим в целом - подход UNION делает все это в одном вызове SQL. В целом это будет наиболее «эффективным», но могут возникнуть побочные проблемы, которые могут повлиять на степень «эффективности» для вашего конкретного приложения.

В частности, если UNION требуется временная таблица для сбора промежуточных результатов и вы работаете с очень большими наборами данных, то выполнение двух отдельных прямых SELECT в новую таблицу может оказаться более эффективным в вашем конкретном случае. Это будет зависеть от внутренней работы, выполненных оптимизаций и т. Д. В ядре базы данных (которое может меняться в зависимости от версии используемого вами механизма базы данных).

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

Возможно, вы также захотите учесть, что разница между временем, необходимым для двух отдельных запросов, и запросом "все в одном" может быть незначительной в общей схеме вещей ... вы, вероятно, говорите о разнице в несколько миллисекунды (или даже микросекунды?), если ваша база данных mysql не находится на отдельном сервере с огромными задержками. Если вы выполняете тысячи таких вызовов за один раз, тогда разница может быть значительной, но если вы делаете только один или два из этих вызовов, а ваше приложение тратит 99,99% своего времени на выполнение других задач, то разница между двое, вероятно, даже не будут замечены.

--- Лоуренс

0 голосов
/ 15 мая 2009

Подход UNION определенно должен быть быстрее из-за затрат на выполнение двух вызовов mysql api из php против одного.

0 голосов
/ 15 мая 2009

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

РЕДАКТИРОВАТЬ: После прочтения вашего комментария, я думаю, что вы после чего-то вроде этого:

SELECT true, где (EXISTS (SELECT field1, field2 ...) И EXISTS (SELECT Field1, field2 ...)).

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

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

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