php conference 2014: uma string em dez milhões de documentos em menos de um segundo - php e sphinx...
TRANSCRIPT
![Page 1: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/1.jpg)
![Page 2: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/3.jpg)
"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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/5.jpg)
“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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/6.jpg)
“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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/7.jpg)
“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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/12.jpg)
“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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/24.jpg)
indexer &searchd
![Page 25: PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/29.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/31.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/32.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/33.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/36.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042701/55c14889bb61eb4a5e8b472d/html5/thumbnails/37.jpg)
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