PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx...
-
Upload
aryel-tupinamba -
Category
Software
-
view
197 -
download
1
Transcript of PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx...
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á
"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
Era uma vez um cliente…
Novo portal de notícias
Base de dados legada com de 1 milhão de artigos
“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
?
“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
“Tá legal, mas cadê a busca?”
Como fazer?
Será que é viável?
Vai caber no orçamento?
Vamos tentar o de sempre!
TO THE RESCUE!
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?
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?
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…?”
“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
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
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
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
A Sphinx Search
- Curva de aprendizado suave- Plug-and-play- Windows, Mac e Linux- Fácil configuração e fine-tuning
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
Mas será que escala?
Fonte: MySQL AB (recomendo altamente o artigo!)http://en.oreilly.com/mysql2008/public/schedule/detail/511
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
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
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
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
indexer &searchd
- Configura como irão rodas os dois programas principais do Sphinx
indexer &searchd
Rodando o indexer
indexer
MySQL
SphinxIndex
BuscandoDá pra usar uma conexão MySQL normal para buscarFunção MATCH() busca no índice fulltext
Buscando
Usando a API PHP para realizar consultas
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
Atualizando "live"
Leva um pouco mais de tempo que um insert convencional (algo entre 1 e 100 segundos, dependendo do tamanho do índice)
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)
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
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
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
USE A FERRAMENTA IDEALPARA CADA PROBLEMA!
Dúvidas?
Eu sei que o coffee break é logo mais, mas guentaí que eu tenho um recado rápido antes de encerrar!
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!
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