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á
"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
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ção
Lento 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ção
Lento 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
Sphinx
Index
Query usando a API ou SphinxQL
Conexão via protocolo MySQL wire
Query SQL com tabela
do 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
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 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 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 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!
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

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

  • 2.
    Sobre o palestrante Co-fundadore 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á
  • 3.
    "I have aplan" (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
  • 4.
    Era uma vezum cliente… Novo portal de notícias Base de dados legada com de 1 milhão de artigos
  • 5.
    “Tá legal, mascadê 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.
    “Tá legal, mascadê 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
  • 7.
    “Tá legal, mascadê a busca?” Como fazer? Será que é viável? Vai caber no orçamento?
  • 8.
    Vamos tentar ode sempre! TO THE RESCUE!
  • 9.
    Vamos tentar ode 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?
  • 10.
    Vamos tentar ode 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?
  • 11.
    If all youhave 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…?”
  • 12.
    “Podemos usar umatabela 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
  • 13.
    The right toolsfor 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
  • 14.
    Outras soluções - ApacheSolr - 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
  • 15.
    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
  • 16.
    A Sphinx Search -Curva de aprendizado suave - Plug-and-play - Windows, Mac e Linux - Fácil configuração e fine-tuning
  • 17.
    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
  • 18.
    Mas será queescala? Fonte: MySQL AB (recomendo altamente o artigo!) http://en.oreilly.com/mysql2008/public/schedule/detail/511
  • 19.
    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
  • 20.
    Instalando e configurando apt-getinstall 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
  • 21.
    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
  • 22.
    Indexes - Índice dotipo 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
  • 23.
    indexer & searchd - Configuracomo irão rodas os dois programas principais do Sphinx
  • 24.
  • 25.
  • 26.
    Buscando Dá pra usaruma conexão MySQL normal para buscar Função MATCH() busca no índice fulltext
  • 27.
    Buscando Usando a API PHPpara realizar consultas
  • 28.
    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
  • 29.
    Atualizando "live" Leva umpouco mais de tempo que um insert convencional (algo entre 1 e 100 segundos, dependendo do tamanho do índice)
  • 30.
    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)
  • 31.
    Indexes - Índice dotipo 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
  • 32.
    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
  • 33.
    Wrap-up - Pode usaro 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
  • 34.
    USE A FERRAMENTAIDEAL PARA CADA PROBLEMA!
  • 35.
    Dúvidas? Eu sei queo coffee break é logo mais, mas guentaí que eu tenho um recado rápido antes de encerrar!
  • 36.
    A está contratando! Procuramosdesenvolvedores 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!
  • 37.
    Muitíssimo obrigado! Hora docoffee 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