Como converter MySQL para Sphinx

A nova versão do Sphinx 0.9.9-rc2, possui suporte à MySQL denominado SphinxQL e utiliza o SQL como uma linguagem de consulta a índices do Sphinx. O projeto que encontra-se em sua fase inicial possibilita uma excelente pré-visualização e muitas brincadeiras interessantes.

Por | @gregoryylaborde Programação
<p>A nova vers&atilde;o do Sphinx 0.9.9-rc2, possui suporte &agrave; MySQL denominado SphinxQL e utiliza o SQL como uma linguagem de consulta a &iacute;ndices do Sphinx. O projeto que encontra-se em sua fase inicial possibilita uma excelente pr&eacute;-visualiza&ccedil;&atilde;o e muitas brincadeiras interessantes.</p> <p>Para a realiza&ccedil;&atilde;o deste teste n&atilde;o se faz interessante o desempenho integral de texto dentro da pesquisa, j&aacute; que o Sphinx demonstra um bom desempenho em pesquisas de texto completo.</p> <pre><code>[root@r27 sp]# mysql --host 127.0.0.1 --port 3307 Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 Server version: 0.9.9-id64-rc2 (r1785) Type 'help;' or 'h' for help. Type 'c' to clear the buffer.</code></pre> <p>Para os testes foi utilizado o motor de busca existente no f&oacute;rum, restando alguns ids e removendo todo o resto:</p> <pre><code>CREATE TABLE `sptest` ( `id` bigint(20) unsigned NOT NULL, `site_id` int(10) unsigned NOT NULL, `forum_id` int(10) unsigned NOT NULL, `author_id` int(10) unsigned NOT NULL, `num_links` smallint(5) unsigned NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8</code></pre> <p>Esta tabela continha cerca de 25 milh&otilde;es de linhas e n&atilde;o existem &iacute;ndices definidos, Sphinx n&atilde;o possui suporte &agrave; &iacute;ndices expl&iacute;citos &eacute; claro que quando for poss&iacute;vel a utiliza&ccedil;&atilde;o &iacute;ndices em MySQL isto ser&aacute; bastante r&aacute;pido.&nbsp;O Sphinx &eacute; um sistema inteligente que realiza triagem, pois n&atilde;o tenta solucionar tudo mas sim exibe o n&uacute;mero de linhas que s&atilde;o necess&aacute;rias para que se atinja o limite.</p> <h2><strong>Sphinx</strong></h2> <pre><code>mysql> select forum_id as f from sptest order by author_id desc limit 10; +------------+--------+----------+ | id | weight | forum_id | +------------+--------+----------+ | 6739362135 | 1 | 2736983 | | 6739362391 | 1 | 2736983 | | 6739338327 | 1 | 1024599 | | 6739357527 | 1 | 1023063 | | 6739359063 | 1 | 1024599 | | 6739305559 | 1 | 2558807 | | 6739336791 | 1 | 2558807 | | 6739300695 | 1 | 208215 | | 6739297111 | 1 | 2736471 | | 6739296855 | 1 | 2736471 | +------------+--------+----------+ 10 rows in set (7.92 sec)</code></pre> <h2><strong>MySQL</strong></h2> <pre><code>mysql> select forum_id as f from sptest order by author_id desc limit 10; +---------+ | f | +---------+ | 2736983 | | 2736983 | | 1024599 | | 1023063 | | 1024599 | | 2558807 | | 2558807 | | 208215 | | 2736471 | | 2736471 | +---------+ 10 rows in set (17.91 sec)</code></pre> <p>Como pode ser visto, o Sphinx acresce um par de colunas extras para o conjunto de resultados, mesmo que isso n&atilde;o seja pedido pelo usu&aacute;rio. Uma outra coisa interessante &eacute; o GROUP BY, o Sphinx realiza a execu&ccedil;&atilde;o na mem&oacute;ria fixa o que significa que os resultados podem ser bastante aproximados, esta t&eacute;cnica e voltada para aplica&ccedil;&otilde;es de pesquisa de texto completo quando a exatid&atilde;o dos n&uacute;meros n&atilde;o &eacute; importante.</p> <h2><strong>Sphinx</strong></h2> <pre><code>mysql> select max(forum_id) as m,author_id as a from sptest group by author_id order by m desc limit 10; +------------+--------+----------+-----------+---------+ | id | weight | forum_id | author_id | m | +------------+--------+----------+-----------+---------+ | 6739362135 | 1 | 2736983 | 139452247 | 2736983 | | 6738995287 | 1 | 1762135 | 134125655 | 2736727 | | 6739296855 | 1 | 2736471 | 139450967 | 2736471 | | 6739297111 | 1 | 2736471 | 139451223 | 2736471 | | 6739227479 | 1 | 2736215 | 139449687 | 2736215 | | 6739227735 | 1 | 2736215 | 139449943 | 2736215 | | 6739226967 | 1 | 2735959 | 139449175 | 2735959 | | 6739227223 | 1 | 2735959 | 139449431 | 2735959 | | 6739223383 | 1 | 2735703 | 139448663 | 2735703 | | 6739223639 | 1 | 2735703 | 139448919 | 2735703 | +------------+--------+----------+-----------+---------+ 10 rows in set (32.47 sec)</code></pre> <h2><strong>MySQL</strong></h2> <pre><code>mysql> select max(forum_id) as m,author_id as a from sptest group by author_id order by m desc limit 10; +---------+-----------+ | m | a | +---------+-----------+ | 2736983 | 139452247 | | 2736727 | 134125655 | | 2736471 | 139450967 | | 2736471 | 139451223 | | 2736215 | 139449687 | | 2736215 | 139449943 | | 2735959 | 139449175 | | 2735959 | 139449431 | | 2735703 | 139448663 | | 2735703 | 139448919 | +---------+-----------+ 10 rows in set (1 min 15.03 sec)</code></pre> <p>Uma otimiza&ccedil;&atilde;o que se faz interessante realizar &eacute; no &ldquo; bloco de rejei&ccedil;&atilde;o secund&aacute;rio&rdquo; que deve permitir o r&aacute;pido descarte de grandes blocos de atributos caso eles n&atilde;o possuam nem um dado:</p> <h2><strong>Sphinx</strong></h2> <pre><code>select max(author_id) as a ,forum_id as f from sptest where num_links=1; Empty set (2.70 sec)</code></pre> <h2><span style="font-weight: bold;">MySQL</span></h2> <pre><code>mysql> select max(author_id) as a ,forum_id as f from sptest where num_links=1; +------+---+ | a | f | +------+---+ | NULL | NULL | +------+---+ 1 row in set (4.29 sec)</code></pre> <p>Era de se esperar levar um tempo muito maior no teste desta otimiza&ccedil;&atilde;o, que aparentemente est&aacute; quebrada na vers&atilde;o testada. Al&eacute;m disto, podemos notar a diferen&ccedil;a no conjunto de resultados pois o Sphinx n&atilde;o encontra nenhum registro e n&atilde;o cria grupos, em contra partida o MySQL gera relat&oacute;rios de grupos exibindo NULL como resultado.</p> <p>O SphinxQL &eacute; bastante exigente pois requer AS em todas as suas express&otilde;es, ele tamb&eacute;m deixa de analisar algumas consultas, esperamos que em um futuro pr&oacute;ximo isto venha a ser melhorado. A boa coisa &eacute; que os mecanismos de consulta e execu&ccedil;&atilde;o s&atilde;o bastante est&aacute;veis, o que significa que v&atilde;o estar estabilizados em breve.</p> <p>O Sphinx oferece aos seus usu&aacute;rio um n&uacute;mero de extens&otilde;es para SQL, que se mostram bastante uteis em casos de busca, dentro da ordem GROUP BY permitindo a sele&ccedil;&atilde;o de itens e a escolha dos mesmo destro de determinados grupos ( como se gostaria mostrar os documentos mais recentes ou mais relevantes) e outros.&nbsp;Voc&ecirc; pode utilizar a API nativa que &eacute; mais completa em termos de recursos, mas a linha de comando torna-se bastante &uacute;til para testes e depura&ccedil;&otilde;es, o Sphinx pode ser acessado a partir de linguagens que n&atilde;o possuem suporte para sua API, mas todos interpretam MySQL.</p> <p>Agora sobre o desempenho , para determinada classe de consultas o Sphinx era apenas 1,5-2 vezes mais r&aacute;pido. Sinceramente esper&aacute;vamos mais, embora de forma cuidadosa foram colhidas consultas que s&atilde;o razoavelmente positivas para ambos &eacute; f&aacute;cil de "quebrar" o MySQL para criar grupo, com disco tempor&aacute;rio o Sphinx &eacute; muito mais r&aacute;pido e alguns outros pontos.</p> <p>O ganho real do Sphinx est&aacute; na sua capacidade de escala quase de forma linear que trabalha com m&uacute;ltiplos n&uacute;cleos da CPU e diversos n&oacute;s dentro do sistemas.A velocidade de digitaliza&ccedil;&atilde;o-prima foi de quase 10 milh&otilde;es de linhas por segundo, isso significa que voc&ecirc; deve ser capaz de realizar uma varredura atrav&eacute;s de linhas + 100M no servidor de n&uacute;cleo &uacute;nico, que &eacute; um excelente quantitativo.</p> <p><em>Traduzido de: <a href="http://www.mysqlperformanceblog.com/2009/04/19/talking-mysql-to-sphinx/" target="_blank">http://www.mysqlperformanceblog.com</a></em></p>

Mais sobre: mysql, sphinx, conexão
Share Tweet
DESTAQUESMais compartilhados
Comentários
Continue lendo