Pergunta

Eu tenho duas consultas MySQL que ambos os dados inserir em uma tabela. Ambos têm o seguinte formato:

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

As únicas diferenças entre as duas consultas são como field1 e field2 são determinados, e algumas pequenas diferenças na cláusula condições. Ambos correm até 12K e mais registros.

Agora, o que será mais eficiente:

A. Executar as duas consultas separadamente:

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

B. Ou combinar as duas consultas com um UNION, e executar uma vez:

$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)

Os dados do uma consulta é inútil sem os dados do outro, de modo que tanto precisa para ter sucesso. DO_ONE e DO_TWO são funções MySQL definidos pelo usuário que mudam os dados de campo de acordo com algumas especificações.

Foi útil?

Solução

A resposta de Aaronmccall é provavelmente o melhor em geral - a abordagem da União faz tudo em uma chamada SQL. Em geral, que será o mais "eficiente", mas poderia haver problemas colaterais que podem entrar em jogo e afetam a medida de "eficiente" para sua aplicação específica.

Especificamente, se a União requer uma tabela temporária para reunir os resultados intermediários e você está trabalhando com grandes conjuntos de dados, em seguida, fazendo dois SELECTs retas separadas para a nova tabela pode vir a ser mais eficiente no seu caso particular. Isso vai depender de funcionamento interno, otimizações feito, etc dentro do motor de banco de dados (que pode mudar dependendo da versão do motor de banco de dados você está usando).

Em última análise, a única maneira de responder a sua pergunta sobre essa questão específica, como isso pode ser para fazer horários para a sua aplicação e ambiente particular.

Você também pode querer considerar que a diferença entre o tempo necessário para duas consultas separadas vs uma consulta "tudo em um" pode ser insignificante no grande esquema das coisas ... você provavelmente está falando de uma diferença de poucos milissegundos (ou mesmo microssegundos?) a menos que seu banco de dados MySQL está em um servidor separado com enormes problemas de latência. Se você está fazendo milhares de essas chamadas em um único tiro, então a diferença pode ser significativa, mas se você está apenas fazendo uma ou duas dessas chamadas e sua aplicação está a gastar 99,99% do seu tempo executando outras coisas, então a diferença entre o dois provavelmente não vai mesmo ser notado.

--- Lawrence

Outras dicas

A abordagem da União deve definitivamente ser mais rápido devido à despesa de fazer duas chamadas de API do MySQL de um php vs..

As suas opções de fazer coisas diferentes. Primeiro um retorna os resultados da segunda consulta se executa a primeira consulta corretamente (o que é BTW independente dos resultados que ele retorna, ele pode ser retornando um conjunto de linhas vazio). retorna um segundo os resultados da primeira consulta e a segunda consulta em conjunto. A primeira opção parece-me bastante inútil, provavelmente o que você quer alcançar é o que você fez com a União (a menos que eu missunderstood você).

EDIT: Depois de ler o seu comentário, eu acho que você está atrás de algo parecido com isto:

SELECT verdadeiro quando (EXISTS (SELECT campo1, campo2 ...) e que existe (SELECT campo1, campo2 ...)).

Dessa forma, você terá apenas uma consulta para o DB, que escalas melhores, leva menos recursos do pool de conexão e não duplicar o impacto da latência se tiver o seu motor DB em um servidor diferente, mas você AINDA interromper a consulta se a primeira condição falhar, que é a melhoria do desempenho que você procura com as consultas separadas aninhadas.

Como uma otimização, tentar ter primeiro a condição de que irá executar mais rápido, no caso de eles não são os mesmos. Presumo que, se um deles requer esses cálculos de campo seria mais lento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top