SlideShare uma empresa Scribd logo
1 de 37
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresDouglas V. Pasqua
 
Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7Claudio Miranda
 
Frontend (RailsMG)
Frontend (RailsMG)Frontend (RailsMG)
Frontend (RailsMG)Daniel Lopes
 
Docker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG CabreúvaDocker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG CabreúvaMatheus Fidelis
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHPFelipe Ribeiro
 
Sqlite - Introdução
Sqlite - IntroduçãoSqlite - Introdução
Sqlite - IntroduçãoJoao Johanes
 
Escalando API's com NodeJS, Docker e RabbitMQ
Escalando API's com NodeJS, Docker e RabbitMQEscalando API's com NodeJS, Docker e RabbitMQ
Escalando API's com NodeJS, Docker e RabbitMQMatheus Fidelis
 
Cloud Mysql e MariaDB em alta performance
Cloud Mysql e MariaDB em alta performanceCloud Mysql e MariaDB em alta performance
Cloud Mysql e MariaDB em alta performanceSaveincloud
 
Mais performance com o MySQL 5.6
Mais performance com o MySQL 5.6Mais performance com o MySQL 5.6
Mais performance com o MySQL 5.6MySQL Brasil
 
JBoss-WildFly - Avançado
JBoss-WildFly - AvançadoJBoss-WildFly - Avançado
JBoss-WildFly - AvançadoAdriano Schmidt
 
WordPress Multisite: Desenvolvendo Portais com Sites Interligados.
WordPress Multisite: Desenvolvendo Portais com Sites Interligados.WordPress Multisite: Desenvolvendo Portais com Sites Interligados.
WordPress Multisite: Desenvolvendo Portais com Sites Interligados.Nícholas André
 
WildFly Avançado - TDC Floripa 2015
WildFly Avançado - TDC Floripa 2015WildFly Avançado - TDC Floripa 2015
WildFly Avançado - TDC Floripa 2015Adriano Schmidt
 
Alto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLAlto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLJonas Silveira
 

Mais procurados (20)

Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedores
 
Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7
 
Clusterização de Aplicações PHP
Clusterização de Aplicações PHPClusterização de Aplicações PHP
Clusterização de Aplicações PHP
 
Frontend (RailsMG)
Frontend (RailsMG)Frontend (RailsMG)
Frontend (RailsMG)
 
Docker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG CabreúvaDocker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG Cabreúva
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
Sqlite - Introdução
Sqlite - IntroduçãoSqlite - Introdução
Sqlite - Introdução
 
Web seminario varnish
Web seminario varnishWeb seminario varnish
Web seminario varnish
 
Escalando API's com NodeJS, Docker e RabbitMQ
Escalando API's com NodeJS, Docker e RabbitMQEscalando API's com NodeJS, Docker e RabbitMQ
Escalando API's com NodeJS, Docker e RabbitMQ
 
Cloud Mysql e MariaDB em alta performance
Cloud Mysql e MariaDB em alta performanceCloud Mysql e MariaDB em alta performance
Cloud Mysql e MariaDB em alta performance
 
Mais performance com o MySQL 5.6
Mais performance com o MySQL 5.6Mais performance com o MySQL 5.6
Mais performance com o MySQL 5.6
 
PHP FrameWARks - CakePHP
PHP FrameWARks - CakePHPPHP FrameWARks - CakePHP
PHP FrameWARks - CakePHP
 
Instalação CakePHP 2.2.3
Instalação CakePHP 2.2.3Instalação CakePHP 2.2.3
Instalação CakePHP 2.2.3
 
Componentes Web J2EE
Componentes Web J2EEComponentes Web J2EE
Componentes Web J2EE
 
JBoss-WildFly - Avançado
JBoss-WildFly - AvançadoJBoss-WildFly - Avançado
JBoss-WildFly - Avançado
 
WordPress Multisite: Desenvolvendo Portais com Sites Interligados.
WordPress Multisite: Desenvolvendo Portais com Sites Interligados.WordPress Multisite: Desenvolvendo Portais com Sites Interligados.
WordPress Multisite: Desenvolvendo Portais com Sites Interligados.
 
WildFly Avançado - TDC Floripa 2015
WildFly Avançado - TDC Floripa 2015WildFly Avançado - TDC Floripa 2015
WildFly Avançado - TDC Floripa 2015
 
Alto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLAlto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQL
 
Wordpress Instalação
Wordpress InstalaçãoWordpress Instalação
Wordpress Instalação
 
Zabbix 3 0-cinfotec
Zabbix 3 0-cinfotecZabbix 3 0-cinfotec
Zabbix 3 0-cinfotec
 

Destaque

PHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHPPHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHPAryel Tupinambá
 
Real World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionReal World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionStephan Hochdörfer
 
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EE
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EEJavaOne 2014 - Supporting Multi-tenancy Applications with Java EE
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EERodrigo Cândido da Silva
 
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015Innomatic Platform
 
How to build customizable multitenant web applications - IPC11 Spring Edition
How to build customizable multitenant web applications - IPC11 Spring EditionHow to build customizable multitenant web applications - IPC11 Spring Edition
How to build customizable multitenant web applications - IPC11 Spring EditionStephan Hochdörfer
 
Multi-tenancy in Java
Multi-tenancy in JavaMulti-tenancy in Java
Multi-tenancy in Javaseges
 

Destaque (7)

PHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHPPHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
 
Mashing up JavaScript
Mashing up JavaScriptMashing up JavaScript
Mashing up JavaScript
 
Real World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionReal World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring Edition
 
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EE
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EEJavaOne 2014 - Supporting Multi-tenancy Applications with Java EE
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EE
 
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
 
How to build customizable multitenant web applications - IPC11 Spring Edition
How to build customizable multitenant web applications - IPC11 Spring EditionHow to build customizable multitenant web applications - IPC11 Spring Edition
How to build customizable multitenant web applications - IPC11 Spring Edition
 
Multi-tenancy in Java
Multi-tenancy in JavaMulti-tenancy in Java
Multi-tenancy in Java
 

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

Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPLuiz Henrique Zambom Santana
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e ElasticsearchTDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearchtdc-globalcode
 
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...Tchelinux
 
Path to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
Path to the future #5 - Melhores práticas de data warehouse no Amazon RedshiftPath to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
Path to the future #5 - Melhores práticas de data warehouse no Amazon RedshiftAmazon Web Services LATAM
 
Escalando para os primeiros 10 milhoes de usuarios
Escalando para os primeiros 10 milhoes de usuariosEscalando para os primeiros 10 milhoes de usuarios
Escalando para os primeiros 10 milhoes de usuariosAmazon Web Services LATAM
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopAlexei Znamensky
 
MySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - NaveggMySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - NaveggFelipe Guimarães
 
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full TextFull Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full TextRodrigo Urubatan
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - IntroduçãoMarco Pinheiro
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBAri Stopassola Junior
 

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

Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day Workshop
 
Bigadata casese opotunidades
Bigadata casese opotunidadesBigadata casese opotunidades
Bigadata casese opotunidades
 
Primeiros Passos Com Elasticsearch
Primeiros Passos Com ElasticsearchPrimeiros Passos Com Elasticsearch
Primeiros Passos Com Elasticsearch
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHP
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e ElasticsearchTDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
 
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
 
Path to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
Path to the future #5 - Melhores práticas de data warehouse no Amazon RedshiftPath to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
Path to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
 
Escalando para os primeiros 10 milhoes de usuarios
Escalando para os primeiros 10 milhoes de usuariosEscalando para os primeiros 10 milhoes de usuarios
Escalando para os primeiros 10 milhoes de usuarios
 
De 1 a 1.000.00 de usuários
De 1 a 1.000.00 de usuáriosDe 1 a 1.000.00 de usuários
De 1 a 1.000.00 de usuários
 
Big data e a globo.com - 2017
Big data e a globo.com - 2017Big data e a globo.com - 2017
Big data e a globo.com - 2017
 
Php Math and arrays
Php Math and arraysPhp Math and arrays
Php Math and arrays
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl Workshop
 
MySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - NaveggMySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - Navegg
 
Ferramentas open-source
Ferramentas open-sourceFerramentas open-source
Ferramentas open-source
 
MySQL - Workshop Buscapé
MySQL - Workshop BuscapéMySQL - Workshop Buscapé
MySQL - Workshop Buscapé
 
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full TextFull Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - Introdução
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
TechEd_OFC305
TechEd_OFC305TechEd_OFC305
TechEd_OFC305
 

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

  • 1.
  • 2. 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á
  • 3. "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
  • 4. Era uma vez um cliente… Novo portal de notícias Base de dados legada com de 1 milhão de artigos
  • 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. “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
  • 7. “Tá legal, mas cadê a busca?” Como fazer? Será que é viável? Vai caber no orçamento?
  • 8. Vamos tentar o de sempre! TO THE RESCUE!
  • 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 razoável, vários casos de exceção Lento para inserir um registro Sou obrigado a usar o MyISAM?
  • 10. 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?
  • 11. 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…?”
  • 12. “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
  • 13. 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
  • 14. 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
  • 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á que escala? 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-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
  • 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 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
  • 23. indexer & searchd - Configura como irão rodas os dois programas principais do Sphinx
  • 26. Buscando Dá pra usar uma conexão MySQL normal para buscar Função MATCH() busca no índice fulltext
  • 27. Buscando Usando a API PHP para 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 um pouco 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 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
  • 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 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
  • 34. USE A FERRAMENTA IDEAL PARA CADA PROBLEMA!
  • 35. Dúvidas? Eu sei que o coffee break é logo mais, mas guentaí que eu tenho um recado rápido antes de encerrar!
  • 36. 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!
  • 37. 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