É melhor usar uma instrução Select preparado quando você está apenas fazendo uma escolha?

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

Pergunta

Atualmente, estou escrevendo uma classe CRUD em PHP usando PDO.

Eu gosto da segurança que declarações preparadas fornecer, mas eu ouvi que eles também impedir que bancos de dados como o MySQL de usar o QueryCache.

É melhor usar uma instrução Select preparado quando você está apenas fazendo uma escolha de cada vez? ou seria apenas US $ pdo-> quote () suficiente do ponto de vista de segurança (ou ter quaisquer outras vantagens como cache?).

Toda a minha atualização, inserções de exclusão e são feitas usando instruções preparadas já. Eu sou apenas curioso sobre os seleciona.

Foi útil?

Solução

MySQLPerformanceBlog.com fez algumas referências em um artigo sobre " instruções preparadas ". Peter Zaitsev escreveu:

Eu fiz uma referência simples (usando SysBench) para ver o desempenho de simples consulta (ponto de fileira única escolha) usando declaração standard, declaração preparada e tê-lo servido a partir consulta cache. declarações preparadas dar 2,290 consultas / seg que é significativamente melhor do que 2000, com padrão declarações, mas ele ainda está bem abaixo 4470 consultas / seg quando os resultados são servido a partir do cache de consulta.

Isto parece dizer que o "overhead" do uso de instruções preparadas é que eles são 14,5% mais rápido do que usar uma execução de consulta em linha reta, pelo menos neste teste simples. A diferença relativa provavelmente diminui com uma consulta mais complexa ou um conjunto de resultados maior.

Parece contra-intuitivo que consultas preparadas seria mais rápido, dada a dupla de ida e volta para o servidor e outros fatores. referência de Pedro faltam detalhes. De qualquer forma, você deve executar seus próprios testes, porque o tipo de consulta que você executa, e seu ambiente e hardware, são fatores definitivamente importantes.

Quanto Query Cache, era verdade no passado que as declarações preparadas eram incompatíveis com o cache de resultados da consulta, mas isso foi mudado. Consulte " Como o cache de consultas Opera " em a documentação do MySQL:

Antes do MySQL 5.1.17, preparado declarações não usar o cache de consultas. Começando com 5.1.17, preparado declarações usar o cache de consultas sob certas condições, que diferem dependendo do método de preparação: ...

A documentação passa a descrever estas condições. Go lê-lo.

Eu recomendo o uso de declarações preparadas para consultas SELECT. Citando variáveis ??como você interpolar-los em instruções SQL pode ser eficaz se você fizer isso de forma consistente. Mas, mesmo citando pode ter algumas vulnerabilidades de segurança sutis, por exemplo, com conjuntos de caracteres multi-byte (veja MySQL bug # 8378 ). É mais fácil de usar consultas preparadas de forma segura nesses casos.

Outras dicas

Sim, o uso preparado declarações. Eu duvido seriamente que você vai correr em problemas de desempenho com declarações preparadas correr muito mais lento do que apenas uma consulta literal regular. No entanto, no mysql, você parece ser correto. Eu optaria por declarações preparadas no entanto.

Aqui é uma referência: http://www.mysqlperformanceblog.com/2006/08/02 / mysql-preparados-indicações /

Embora, se você está preocupado com o cache, você pode querer olhar para as coisas como memcached .

Este é o meu entendimento, como confirmado pela discussão de: aqui

A consulta normal é tomada como uma única corda, analisado, executado e retornou. Fim da história. Um preparado declaração é tomada como um modelo corda, analisado e armazenado em cache. Isso então tem variáveis ??passadas para ele, quase como uma chamada de função.

Cache a consulta uma vez tende a custo um pouco mais do que apenas executá-lo em linha reta. As economias vêm em tarde chama, quando você pular a compilação degrau. Você economiza per repetido consulta do montante da compilação.

Então, em suma, no MySQL, se você estiver executando uma consulta uma vez, preparando-o apenas acrescenta uma quantidade extra desnecessária de processamento.

declarações preparadas são geralmente considerados para ser melhor prática.

Eu gostaria de sugerir a leitura do MySql artigo em declarações preparadas e seus aspectos práticos e vantagens sobre plain vanilla convencional interpolados consultas fibrosas.

Você está fazendo apenas um seleto "uma vez" no tempo de vida do aplicativo, ou "uma vez" por chamada para a função?

Porque se o último, você ainda deve se beneficiar do cache na declaração preparada de qualquer maneira.

Apenas um lembrete de que o MySQL> 5.1.17 faz uso o cache de consultas para instruções preparadas.

A partir do POV código, eu acredito declarações preparadas são, em sua maior parte, o caminho a percorrer em termos de legibilidade, facilidade de manutenção, etc ...

A única razão para não usá-los seria consultas caras que são chamados com alguma frequência. (Consultas que levam muito tempo para executar e ter um benefício real em estar no cache de consultas).

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