php conference 2014: uma string em dez milhões de documentos em menos de um segundo - php e sphinx...

37

Upload: aryel-tupinamba

Post on 05-Aug-2015

198 views

Category:

Software


1 download

TRANSCRIPT

Page 1: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search
Page 2: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Sobre o palestrante

Co-fundador e CTO da LQDI DigitalProjetos para empresas como Terra, Porto Seguro, Garoto, Whirlpool, Editora Abril, Nestlé e AmBev

Engenheiro da ComputaçãoFormado pela FIAP em 2013

12 anos trabalhando com PHPDesde a época que o PHPClasses era a onda :)

Aryel Tupinambá

Page 3: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

"I have a plan" (kinda)1) O problema2) Soluções "possíveis" com o MySQL3) O porque eu coloquei "possíveis" em aspas4) Introdução rápida ao Sphinx5) Algumas alternativas ao Sphinx6) Sphinx escala?7) Configurando data sources8) Índices do tipo "plain"9) Índices do tipo "real-time" (RT)

10) Wrap-up11) Moral da história12) Dúvidas13) Recado rápido do palestrante14) Coffee break! \o/

Aviso! Essa palestra contém:Memes escrotos

Memes engraçadinhosMontagens mal feitas

Argumentos para vender o Sphinx para o chefeCoisa pra ***** pra estudar até o final do ano

Page 4: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Era uma vez um cliente…

Novo portal de notícias

Base de dados legada com de 1 milhão de artigos

Page 5: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

“Tá legal, mas cadê a busca?”

O cliente quer um buscador que indexe todo o conteúdo dos artigos desde 1925

O prazo ainda não mudou

Pediram uma busca "tipo a do Google" em termos de relevância e velocidade

?

Page 6: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

“Tá legal, mas cadê a busca?”

?O cliente quer um buscador que indexe todo o conteúdo dos artigos desde 1925

O prazo ainda não mudou

Pediram uma busca "tipo a do Google" em termos de relevância e velocidade

Page 7: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

“Tá legal, mas cadê a busca?”

Como fazer?

Será que é viável?

Vai caber no orçamento?

Page 8: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Vamos tentar o de sempre!

TO THE RESCUE!

Page 9: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Vamos tentar o de sempre

SELECT * FROM articles WHERE CONCAT(title, keywords) LIKE "%{$query}%"

Queries com LIKE

Lento e sem relevância

SELECT * FROM articles WHERE CONCAT(title, keywords) REGEXP "{$query}"

Queries com REGEXP

Muuuito lento, falsos positivos

SELECT * FROM articles WHERE MATCH(title, keywords) AGAINST("+{$query}") IN BOOLEAN MODE

Queries com MATCH … AGAINST (índices FULLTEXT)

Relevância razoável, vários casos de exceçãoLento para inserir um registro

Sou obrigado a usar o MyISAM?

Page 10: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Vamos tentar o de sempre

SELECT * FROM articles WHERE CONCAT(title, keywords) LIKE "%{$query}%"

Queries com LIKE

Lento e sem relevância

SELECT * FROM articles WHERE CONCAT(title, keywords) REGEXP "{$query}"

Queries com REGEXP

Muuuito lento, falsos positivos

SELECT * FROM articles WHERE MATCH(title, keywords) AGAINST("+{$query}") IN BOOLEAN MODE

Queries com MATCH … AGAINST (índices FULLTEXT)

Relevância baixa, vários casos de exceçãoLento para inserir um registro

Sou obrigado a usar o MyISAM?

Page 11: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

If all you have is a hammer, everything looks like a nail

“Podemos usar uma tabela MyISAM paralela com a InnoDB só para busca!”

“E se a gente trocar os discos do servidor por SSD?”

“E se a gente deixar os caches do MySQL gigantes?”

“E se…?”

Page 12: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

“Podemos usar uma tabela MyISAM paralela com a InnoDB só para busca!”

“E se a gente trocar os discos do servidor por SSD?”

“E se a gente deixar os caches do MySQL gigantes?”

“Será que precisamos trocar o banco de dados?”

If all you have is a hammer, everything looks like a nail

Page 13: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

The right tools for the job

- Usar uma engine própria para busca

- Sphinx: solução quase plug-and-play- Integra-se bem com o MySQL e com o PHP- Fine-tuning opcional e fácil dos índices- Diferença brutal de performance

- Busca- Indexação- Inserção / Atualização

Page 14: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Outras soluções- Apache Solr

- Mais robusta e com mais features- Mais difícil de instalar e configurar (Java JRE/XML hell)

- Amazon CloudSearch- Vendor lock-in e código proprietário- Custo maior e as vezes imprevisível - Potencial de alta latência entre o CloudSearch e o seu servidor

- ElasticSearch- Performance e features semelhantes- Também roda no Java (Java JRE/XML hell)- Maior foco no real-time- API REST, algumas diferenças de paradigma- Foco menor no SQL, combina melhor com NoSQL

Page 15: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

A Sphinx Search

- Existe desde 2001- 100% código aberto- Apoiado por uma empresa comercial- Usado por grandes e pequenos players- Tumblr, The Pirate Bay, Craigslist, BBC, Scribd, Metacafe, OpenSubtitles.org

Page 16: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

A Sphinx Search

- Curva de aprendizado suave- Plug-and-play- Windows, Mac e Linux- Fácil configuração e fine-tuning

Page 17: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

A Sphinx Search

- Até 1000x mais rápida que o FULLTEXT!- Suporta vários tipos de banco de dados- Opções de rankings de relevância- Arquitetura distribuída- Suporte a multi-queries

- Execução de queries em batch- Otimização de queries que só variam no agrupamento- Facilita a busca facetada

Page 18: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Mas será que escala?

Fonte: MySQL AB (recomendo altamente o artigo!)http://en.oreilly.com/mysql2008/public/schedule/detail/511

Page 19: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Arquitetura da plataforma

Fonte: MySQL AB (recomendo altamente o artigo!)http://en.oreilly.com/mysql2008/public/schedule/detail/511

PHP

searchd

indexer

MySQL

SphinxIndex

Query usando a API ou SphinxQL

Conexão via protocolo MySQL wire

Query SQL com tabelado tipo SPHINX

Page 20: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Instalando e configurando

apt-get install sphinxsearch

brew install sphinx --mysql

Baixar o ZIP no site sphinxsearch.com, extrair em algum lugar e rodar o install.bat

Ubuntu e Debian

Mac OS X

Windows

Demais sistemas: ver sphinxsearch.com

Page 21: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Data sources

- Dá pra extender uma source, sobreescrevendo valores

- Attributes: campos armazenados e filtráveis, mas não indexados

- Fields: campos armazenados e indexados

- MVAs: permite indexar e retornar sub-elementos de uma query, como tags, categorias, etc

sphinx.conf

Page 22: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Indexes- Índice do tipo plain: índice

estático, gerado via indexer

- Ideal para poucas inserções e atualizações ao longo do dia, ou inserções pontuais em massa (sites de notícia, catálogos, e-commerces com poucas promoções)

- Inúmeras otimizações possíveis via configuração

Page 23: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

indexer &searchd

- Configura como irão rodas os dois programas principais do Sphinx

Page 24: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

indexer &searchd

Page 25: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Rodando o indexer

indexer

MySQL

SphinxIndex

Page 26: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

BuscandoDá pra usar uma conexão MySQL normal para buscarFunção MATCH() busca no índice fulltext

Page 27: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Buscando

Usando a API PHP para realizar consultas

Page 28: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

ReindexandoReindexar tudo

A opção --rotate permite que o índice seja construido em outro arquivo, permitindo que o searchd continue servindo buscas durante a reindexação

Page 29: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Atualizando "live"

Leva um pouco mais de tempo que um insert convencional (algo entre 1 e 100 segundos, dependendo do tamanho do índice)

Page 30: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Delta indexes

Separa o índice em dois, mantém os dados mais recentes (hot-band) atualizados com frequência, e os dados antigos com menos frequência (ou sem atualizar)

Page 31: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Indexes- Índice do tipo real-time: o

índice é alimentado e atualizado em tempo real

- Ideal para bases de dados "quentes", dados alimentados via crowdsourcing, ítens únicos e singulares

- Não possuem data sources; devem ser alimentados manualmente através de INSERTs realizados via SphinxQL

- Uma pré-alimentação pode ser feita através de um índice plain, seguido de um comando ATTACH

Page 32: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Manipulando o índice (RT)Queries com SphinxQL funcionam igual

Se quiser transformar um índice plain em realtime, é só usar o comando ATTACH

O comando renomeia os arquivos de índice, fazendo a migração instantaneamente

Page 33: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Wrap-up- Pode usar o Sphinx sempre que precisar de

busca em grandes massas de dados

- Ótima alternativa para o FULLTEXT do MySQL

- Escala muito bem, dificilmente precisará trocar por uma engine mais robusta

- Roda muito bem em uma box de $5/mês da DigitalOcean

- Não se apegue! Teste e compare com ElasticSearch, Solr e outras soluções

Page 34: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

USE A FERRAMENTA IDEALPARA CADA PROBLEMA!

Page 35: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Dúvidas?

Eu sei que o coffee break é logo mais, mas guentaí que eu tenho um recado rápido antes de encerrar!

Page 36: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

A está contratando!Procuramos desenvolvedores front-end e back-end, de TODOS os níveis de

experiência, apaixonados pelo que fazem e a fim de aprender e ensinar

Ambiente de trabalho bacana, descontraído, com remuneração competitiva, horários flexíveis e bastante abertura para novas idéias. Sem melindres, sem preciosismo e puxação de saco :D

Plano de carreira sólido e flexível, com espaço para crescimento em gestão e especialização, e programas de feedback contínuo entre a equipe e os gestores.

Manda um e-mail pra [email protected] e cite a palestra da PHP ConferenceMe chame pessoalmente agora no coffee break para trocarmos uma idéia

Começe 2015 de trampo novo!

Page 37: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search

Muitíssimo obrigado!Hora do coffee break :)

CONTATOSE-mail/Hangouts: [email protected]: @DfKimeraLinkedIn: br.linkedin.com/aryel.tupinambaCurriculos para: [email protected] (por favor, cite a PHPConference)

SLIDES DA PALESTRA:http://slideshare.com/aryeltupinamba