Sobre o palestrante
Co-fundador e CTO da LQDI Digital
Projetos para empresas como Terra, Porto Seguro,
Garoto, Whirlpool, ...
"I have a plan" (kinda)
1) O problema
2) Soluções "possíveis" com o MySQL
3) O porque eu coloquei "possíveis" em aspas
4) ...
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...
“Tá legal, mas cadê a busca?”
?
O cliente quer um buscador
que indexe todo o
conteúdo dos artigos
desde 1925
O prazo ainda...
“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 s...
Vamos tentar o de sempre
SELECT * FROM articles WHERE CONCAT(title, keywords) LIKE "%{$query}%"
Queries com LIKE
Lento e s...
If all you have is a hammer,
everything looks like a nail
“Podemos usar uma tabela MyISAM
paralela com a InnoDB só para bu...
“Podemos usar uma tabela MyISAM
paralela com a InnoDB só para busca!”
“E se a gente trocar os discos do servidor
por SSD?”...
The right tools for the job
- Usar uma engine própria para busca
- Sphinx: solução quase plug-and-play
- Integra-se bem co...
Outras soluções
- Apache Solr
- Mais robusta e com mais features
- Mais difícil de instalar e configurar (Java JRE/XML hel...
A Sphinx Search
- Existe desde 2001
- 100% código aberto
- Apoiado por uma empresa comercial
- Usado por grandes e pequeno...
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 r...
Mas será que escala?
Fonte: MySQL AB (recomendo altamente o artigo!)
http://en.oreilly.com/mysql2008/public/schedule/detai...
Arquitetura da plataforma
Fonte: MySQL AB (recomendo altamente o artigo!)
http://en.oreilly.com/mysql2008/public/schedule/...
Instalando e configurando
apt-get install sphinxsearch
brew install sphinx --mysql
Baixar o ZIP no site sphinxsearch.com, ...
Data sources
- Dá pra extender uma
source, sobreescrevendo
valores
- Attributes: campos
armazenados e filtráveis,
mas não ...
Indexes
- Índice do tipo plain: índice
estático, gerado via indexer
- Ideal para poucas
inserções e atualizações
ao longo ...
indexer &
searchd
- Configura como irão rodas
os dois programas
principais do Sphinx
indexer &
searchd
Rodando o indexer
indexer
MySQL
Sphinx
Index
Buscando
Dá pra usar uma conexão MySQL normal para buscar
Função MATCH() busca no índice fulltext
Buscando
Usando a API
PHP para
realizar
consultas
Reindexando
Reindexar tudo
A opção --rotate permite que o índice seja construido em outro arquivo, permitindo
que o search...
Atualizando "live"
Leva um pouco mais de tempo que um insert convencional
(algo entre 1 e 100 segundos, dependendo do tama...
Delta indexes
Separa o índice em dois,
mantém os dados mais
recentes (hot-band)
atualizados com
frequência, e os dados
ant...
Indexes
- Índice do tipo real-time: o
índice é alimentado e
atualizado em tempo real
- Ideal para bases de dados
"quentes"...
Manipulando o índice (RT)
Queries com SphinxQL funcionam igual
Se quiser transformar um índice plain em realtime, é só usa...
Wrap-up
- Pode usar o Sphinx sempre que precisar de
busca em grandes massas de dados
- Ótima alternativa para o FULLTEXT d...
USE A FERRAMENTA IDEAL
PARA 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 q...
Muitíssimo obrigado!
Hora do coffee break :)
CONTATOS
E-mail/Hangouts: aryel.tupinamba@lqdi.net
Twitter: @DfKimera
LinkedI...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search
Próximos SlideShares
Carregando em…5
×

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

421 visualizações

Publicada em

Sphinx é uma poderosa plataforma de busca. De fácil instalação e utilização, é o companheiro perfeito para projetos PHP que necessitam buscar strings dentro de grandes volumes de dados em pouco tempo
Descrição : Buscar texto dentro de grandes volumes de dados é cada vez mais algo essencial em projetos de plataformas de conteúdo e gestão. Conforme seu volume de dados cresce, o bom e velho FULLTEXT no MySQL deixa de ser uma opção. Conheça a Sphinx e aprenda como instalá-la, como configurar e calibrar data sources e indexes para que a busca em seus projetos seja fácil de desenvolver, barata e escalável.

Publicada em: Software
0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
421
No SlideShare
0
A partir de incorporações
0
Número de incorporações
7
Ações
Compartilhamentos
0
Downloads
2
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. Sobre o palestrante Co-fundador e CTO da LQDI Digital Projetos para empresas como Terra, Porto Seguro, Garoto, Whirlpool, Editora Abril, Nestlé e AmBev Engenheiro da Computação Formado pela FIAP em 2013 12 anos trabalhando com PHP Desde a época que o PHPClasses era a onda :) Aryel Tupinambá
  2. 2. "I have a plan" (kinda) 1) O problema 2) Soluções "possíveis" com o MySQL 3) O porque eu coloquei "possíveis" em aspas 4) Introdução rápida ao Sphinx 5) Algumas alternativas ao Sphinx 6) Sphinx escala? 7) Configurando data sources 8) Índices do tipo "plain" 9) Índices do tipo "real-time" (RT) 10) Wrap-up 11) Moral da história 12) Dúvidas 13) Recado rápido do palestrante 14) Coffee break! o/ Aviso! Essa palestra contém: Memes escrotos Memes engraçadinhos Montagens mal feitas Argumentos para vender o Sphinx para o chefe Coisa pra ***** pra estudar até o final do ano
  3. 3. Era uma vez um cliente… Novo portal de notícias Base de dados legada com de 1 milhão de artigos
  4. 4. “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 ?
  5. 5. “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
  6. 6. “Tá legal, mas cadê a busca?” Como fazer? Será que é viável? Vai caber no orçamento?
  7. 7. Vamos tentar o de sempre! TO THE RESCUE!
  8. 8. 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ção Lento para inserir um registro Sou obrigado a usar o MyISAM?
  9. 9. 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ção Lento para inserir um registro Sou obrigado a usar o MyISAM?
  10. 10. 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…?”
  11. 11. “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
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. A Sphinx Search - Curva de aprendizado suave - Plug-and-play - Windows, Mac e Linux - Fácil configuração e fine-tuning
  16. 16. 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
  17. 17. Mas será que escala? Fonte: MySQL AB (recomendo altamente o artigo!) http://en.oreilly.com/mysql2008/public/schedule/detail/511
  18. 18. Arquitetura da plataforma Fonte: MySQL AB (recomendo altamente o artigo!) http://en.oreilly.com/mysql2008/public/schedule/detail/511 PHP searchd indexer MySQL Sphinx Index Query usando a API ou SphinxQL Conexão via protocolo MySQL wire Query SQL com tabela do tipo SPHINX
  19. 19. 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
  20. 20. 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
  21. 21. 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
  22. 22. indexer & searchd - Configura como irão rodas os dois programas principais do Sphinx
  23. 23. indexer & searchd
  24. 24. Rodando o indexer indexer MySQL Sphinx Index
  25. 25. Buscando Dá pra usar uma conexão MySQL normal para buscar Função MATCH() busca no índice fulltext
  26. 26. Buscando Usando a API PHP para realizar consultas
  27. 27. Reindexando Reindexar 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
  28. 28. Atualizando "live" Leva um pouco mais de tempo que um insert convencional (algo entre 1 e 100 segundos, dependendo do tamanho do índice)
  29. 29. 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)
  30. 30. 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
  31. 31. 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
  32. 32. 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
  33. 33. USE A FERRAMENTA IDEAL PARA CADA PROBLEMA!
  34. 34. Dúvidas? Eu sei que o coffee break é logo mais, mas guentaí que eu tenho um recado rápido antes de encerrar!
  35. 35. 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 work@lqdi.net e cite a palestra da PHP Conference Me chame pessoalmente agora no coffee break para trocarmos uma idéia Começe 2015 de trampo novo!
  36. 36. Muitíssimo obrigado! Hora do coffee break :) CONTATOS E-mail/Hangouts: aryel.tupinamba@lqdi.net Twitter: @DfKimera LinkedIn: br.linkedin.com/aryel.tupinamba Curriculos para: work@lqdi.net (por favor, cite a PHPConference) SLIDES DA PALESTRA: http://slideshare.com/aryeltupinamba

×