Объедините два запроса MySQL с помощью UNION или программно.

StackOverflow https://stackoverflow.com/questions/867922

  •  22-08-2019
  •  | 
  •  

Вопрос

У меня есть два запроса 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 определены, а также некоторые незначительные различия в условиях пункта.Оба работают до 12К и более записей.

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

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

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

Б.ИЛИ объедините два запроса с помощью 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, которые изменяют данные поля в соответствии с некоторыми спецификациями.

Это было полезно?

Решение

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

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

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

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

---Лоуренс

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top