Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Desempenho do CASE no MySQL?


Praticamente todos funções por linha terão um impacto no desempenho, a única pergunta real é:"O impacto é pequeno o suficiente para não se preocupar?".

Isso é algo que você deve descobrir medindo em vez de adivinhar. A administração do banco de dados é apenas uma atividade definida e esquecida se nem seus dados nem suas consultas forem alterados. Caso contrário, você deve monitorar periodicamente o desempenho para garantir que não ocorram problemas.

Por "pequeno o suficiente" nos comentários acima, quero dizer, você provavelmente não precisa se preocupar com o impacto no desempenho de algo como:
select * from friends where lowercase(lastname) = "smith"

se você tiver apenas três amigos.

O impacto dessas coisas se torna mais sério à medida que a mesa aumenta de tamanho. Por exemplo, se você tem cem milhões de clientes e deseja encontrar todos os que provavelmente estão relacionados a computadores, não tente:
select name from customers where lowercase(name) like '%comp%'

Isso provavelmente derrubará seus DBAs em você como uma tonelada de tijolos.

Uma maneira de corrigir isso no passado é introduzir redundância nos dados. Usando esse primeiro exemplo, adicionaríamos uma coluna extra chamada lowerlastname e preencha-o com o valor minúsculo de lastname . Em seguida, indexe isso para fins de pesquisa e seu select declarações tornam-se incrivelmente rápidas, como deveriam ser.

E o que isso faz com o nosso muito amado 3NF, eu ouço você perguntar? A resposta é "não muito", se você sabe o que está fazendo :-)

Você pode configurar o banco de dados para que essa nova coluna seja preenchida por um gatilho de inserção/atualização, para manter a consistência dos dados. É perfeitamente aceitável quebrar a 3NF por motivos de desempenho, desde que você entenda e mitigue as consequências.

Da mesma forma, essa segunda consulta pode ter um gatilho de inserção/atualização que preencheu uma nova coluna indexada name_contains_comp sempre que uma entrada foi atualizada ou inserida que continha o texto relevante.

Como a maioria dos bancos de dados é lida com muito mais frequência do que gravada, isso transfere o custo do cálculo para a inserção/atualização, amortizando-o efetivamente em todas as operações selecionadas. A consulta seria então:
select name from customers where name_contains_comp = 'Y'

Novamente, você encontrará a consulta incrivelmente rápida com o menor custo de inserções e atualizações um pouco mais lentas.