Utilizando e-mail assinado e criptografado com S/MIME

Para garantir a privacidade de seus e-mails, além de usar uma senha segura e um provedor de e-mail confiável, é extremamente importante a utilização de criptografia ponta-a-ponta; esse tipo de processo garante que só você e o remetente/destinatário tem acesso ao conteúdo da mensagem. Qualquer outra entidade (pessoa, empresa, governo, etc) que obtiver uma cópia da mensagem não poderá ler o conteúdo, pois ele estará “embaralhado”. Nem mesmo o provedor do e-mail terá acesso ao conteúdo. O conteúdo é criptografado em seu dispositivo (computador, smartphone, tablet, etc), e descriptografado no dispositivo do destinatário.

Adicionalmente, é conveniente assinar digitalmente os seus e-mails. Isso garante ao seu destinatário que o seu e-mail realmente partiu de você, e vice-versa.

Tecnologias existentes

Há duas formas bastante conhecidas de criptografar e assinar e-mails: o PGP e o S/MIME.

No PGP, você cria um par de chaves pública e privada, onde a privada é protegida por uma senha, que deve ser digitada cada vez que você a utiliza. Você distribui a sua chave pública para seus contatos, assim eles podem enviar e-mails criptografados para você, bem como saber que e-mails enviados por você são realmente seus (mediante assinatura do e-mail). A garantia que uma chave pertence realmente a uma pessoa não é regulada por nenhuma entidade, mas sim por um conceito de rede de confiança, onde as chaves públicas validadas por contatos nos quais você confia tornam-se também confiáveis por transitividade. Para utilizar o PGP, é necessário instalar um software para manipulação das chaves, bem como é necessário instalar uma extensão em seu cliente de e-mail que dê suporte ao PGP (às vezes, algumas extensões fazem os dois papéis: gerar as chaves e criptografar os e-mails). Outra coisa que é obrigatória é utilizar um cliente de e-mail instalado no seu dispositivo (Thunderbird, Outlook para Desktop, aplicativo de e-mail do seu smartphone, etc). Isso significa que não é possível utilizar o PGP se você utiliza um webmail (como o Roudcube, ou a interface web do Gmail, ou o Outlook.com).

Já no S/MIME, a configuração e utilização é bem mais fácil que o PGP. Você cria um par de chaves pública e privada que será endossada por uma autoridade certificadora acreditada mundialmente. A geração da chave segue um processo que garante que só o dono de uma conta de e-mail pode gerar a chave; ainda, por ser endossada por uma autoridade certificadora, é automaticamente aceita em qualquer cliente com suporte ao S/MIME. Também é obrigatório utilizar um cliente de e-mail instalado em seu dispositivo (como o Thunderbird, Outlook para Desktop, ou o aplicativo de e-mail do seu smartphone). Entretanto, os clientes de e-mail mais populares já tem suporte nativo ao S/MIME, o que garante uma adoção mais fácil do que o PGP. A geração das chaves é feita em qualquer browser moderno, logo, não é necessário instalar um software adicional para isso. Ainda, mesmo que seu destinatário não utilize S/MIME, você pode enviar um e-mail assinado (mas não criptografado), e o cliente de e-mail dele saberá reconhecer a assinatura, e exibir uma notificação de acordo. Não é possível utilizar o S/MIME com webmails, assim como o PGP.

Neste artigo, você aprenderá gerar um certificado S/MIME gratuito e endossado por uma autoridade certificadora acreditada mundialmente, e instalar ele em seu cliente de e-mail (utilizaremos o Thunderbird como exemplo).

Gerando o certificado S/MIME

Vamos gerar um certificado gratuito da COMODO. Entre no site deles clicando aqui.

Clique no botão “GET NOW“. Você será redirecionado a um formulário onde deverá preencher seu nome, sobrenome, endereço de e-mail para o qual deseja gerar o certificado, e país. Deverá, ainda, gerar uma senha de revogação, que será utilizada para invalidar sua chave, caso ela for comprometida (vazada a chave privada, por exemplo). Também é necessário concordar com os termos de utilização da COMODO, ao marcar “I ACCEPT the terms of this Subscriber Agreement.“. Clique em “Next >“.

A COMODO enviará um e-mail para a conta que você informou. Lá, haverá um link no qual você deve entrar para gerar o certificado. Esse processo garante que só alguém com acesso a conta de e-mail pode gerar o certificado.

Ao abrir o link, talvez seu navegador solicite sua permissão para gerar as chaves criptográficas, e você deverá autorizá-lo. Será necessária mais adiante uma senha, que será utilizada para criptografar o seu par de chaves (mas ela só é usada ao importar o certificado em um novo dispositivo). Por fim, uma mensagem informará que a chave foi gerada, e salva no navegador.

Exportando o certificado

O certificado está gerado e salvo dentro do seu navegador. É necessário exportá-lo para usar em seu cliente de e-mail, ou seja, você vai salvar uma cópia do certificado na forma de um arquivo, que pode ser utilizado para instalar o certificado em todos os seus dispositivos. Esse arquivo contém ambas as chaves, pública e privada, por isso jamais permita o acesso de outras pessoas a esse arquivo.

Em seu navegador, vá nas configurações, na tela de certificados. No Firefox, ela se localiza no menu, “Opções”, “Privacidade e Segurança”, “Certificados”, “Ver Certificados”.

Na parte que exibe os seus certificados, selecione o certificado recém gerado, e clique em exportar. Será salvo o arquivo criptografado pela senha que você definiu. Esse arquivo será utilizado em todos os seus dispositivos para instalar o certificado nos seus clientes de e-mail.

Configurando o cliente de e-mail

Eu vou assumir que você já tem o Thunderbird instalado e configurado para receber e enviar e-mails de sua conta.

No Thunderbird, na configuração de contas, há uma seção “Segurança“.

Clique em “Gerenciar certificados“, na aba “Seus certificados“, clique em “Importar” e escolha o certificado. Digite a senha escolhida na geração do certificado.

Após, ainda na seção de Segurança, na caixa “Assinatura digital“, escolha o seu certificado, e marque “Assinar mensagens digitalmente (por padrão)“.

Na caixa “Criptografia“, escolha o certificado, e em “Opção padrão de criptografia ao enviar mensagens” escolha “Nunca (não usar criptografia)“.

Neste ponto, qualquer e-mail que você enviar estará assinado digitalmente. O seu destinatário verá uma marcação indicando este fato.

Para distribuir sua chave pública, basta enviar um e-mail assinado, pois isso adiciona sua chave pública ao e-mail automaticamente. Para receber uma chave pública de um contato seu, solicite que ele lhe envie um e-mail assinado digitalmente.

Para criptografar um e-mail, será necessário que você já tenha a chave pública do destino. Na tela de composição do e-mail, na opção de Segurança, marque “Criptografar“.

Mensagem assinada e criptografada no thunderbird

Criptografando sempre que possível no Thunderbird

Para quem usa o Thunderbird, é possível criptografar por padrão sempre que houver a chave pública do destinatário. Basta instalar a extensão Encrypt if possible.

Clientes que suportam o S/MIME

Há diversos clientes que suportam o S/MIME por padrão. Vale a pena mencionar alguns:

  • Para desktop
  • Para Android
  • Para iOS
    • Apple Mail App (aplicativo padrão de e-mail do iPhone/iPad)

Concluindo

A assinatura e criptografia via S/MIME é de fácil configuração e tem ampla aceitação pelos clientes de e-mail. Ela garante a proveniência das mensagens, e quando ambas as pontas da comunicação (remetente e destinatário) usam, sua privacidade é garantida pela criptografia de ponta a ponta. Em tempos de vigilância digital em massa, é muito conveniente que todos protejam os seus dados pessoais, ainda mais com ferramentas de padrões abertos e reconhecidos.

Ao abrir o link, talvez seu navegador solicite sua permissão para gerar as chaves criptográficas, e você deverá autorizá-lo. Será necessária mais adiante uma senha, que será utilizada para criptografar o seu par de chaves (mas ela só é usada ao importar o certificado em um novo dispositivo). Por fim, uma mensagem informará que a chave foi gerada, e salva no navegador.

A nossa necessidade será a verdadeira criadora

Até dezembro de 2016 eu utilizei um Windows Phone (já com a versão mobile do Windows 10), e o abandonei devido à comodidade, ou a falta dela: um Android era barato o suficiente, e oferecia toda sorte de aplicativos constantemente atualizados provendo os mais variados serviços. Já na loja da Microsoft, aplicativos desatualizados, bugados, e muitas vezes abandonados pelos desenvolvedores.

Recentemente vimos notícias que desanimaram os últimos usuários dessa plataforma: um funcionário de alto escalão da Microsoft, ao ser questionado se era a hora de abandonar o Windows Phone, respondeu não só que a plataforma não vai evoluir, mas que ele próprio já a havia abandonado.

Entretanto, guardo daquela época uma lembrança muito querida: o esforço de desenvolvedores independentes, que na falta de bons aplicativos oficiais, criavam por eles próprios aplicativos alternativos tão bons, mas tão bons, que a experiência de uso superava e muito aos aplicativos oficiais em plataformas atualizadas (Android e iOS).

“A nossa necessidade será a verdadeira criadora”, teria dito Platão.

Cito em particular dois casos muito peculiares: o Tweet It!, que é um cliente de Twitter tão bom, que só pensar em usar o aplicativo oficial desatualizado seria uma loucura. E o Poki, um cliente alternativo do Pocket, com uma usabilidade tão boa quanto, se não melhor que o original.

Os desenvolvedores desses e de outros aplicativos tinham tanto apreço pela plataforma Windows Mobile que, vendo uma necessidade decorrente da falta de bons aplicativos oficiais, se esforçaram, desenvolveram, ganharam uma graninha (espero que sim), e ajudaram a manter essa plataforma usável por um bom tempo, a despeito do descuidado da própria Microsoft. Eles não queriam que essa plataforma morresse.

Entretanto, mesmo com essas alternativas a serviços populares, há aplicativos para os quais não é possível desenvolver alternativas, principalmente quando lidam com serviços fechados: Uber, Cabify, aplicativos de bancos, etc. Nestes casos, os usuários eram obrigados a conviver com versões antigas, capadas ou bugadas dos apps oficiais, isso quando existiam. Vimos a cada dia notícias de mais serviços abandonando e retirando seus apps da plataforma.

O Windows Phone agora jaz em seu leito, mas pra mim o que fica na memória é a comunidade de desenvolvedores que abraçou a ideia, e tentou tornar a vida dos usuários – e a sua própria – um pouco mais fácil.

Obrigado developers, developers, developers.

Eu sou trouxa

Eu sou trouxa, e não é pouco.

Ao longo dos anos tenho pensado em como eu não consigo prejudicar os outros para tirar vantagem, apesar de ver a maior parte da sociedade fazê-lo.

E não falo só dos políticos, que tiram vantagem de sua posição privilegiada para afanar os recursos que deveriam ser retornados à população. Falo no geral.

Uma vez eu decobri que alguém tinha roubado uma tampinha do ventil de um dos pneus do meu carro. O cara devia estar sem, viu meu carro estacionado, foi ali e pegou. Pensei se eu conseguiria fazer o mesmo e tirar a tampinha de outro carro, pra cobrir o meu prejuízo. Até hoje meu pneu está sem a tampinha.

Só de pensar em fazer algo pra tirar vantagem (mediante prejuízo de outros), eu já me reprovo antes de fazer. Se o fizesse, eu nem ia ficar contente com a vantagem. Eu não consigo fazer. Eu fico me colocando no lugar do outro que vai sair prejudicado, e não faço. Eu não dormiria a noite se o fizesse.

Eu me pergunto sempre: como os outros conseguem?

O Mário Sérgio Cortella conta a história de um maratonista que deve ser trouxa como eu. Assista aqui.

Meu consolo é que não sou trouxa sozinho. Essa semana, duas pessoas próximas vieram me confessar que tem o mesmo dilema. Uma, inclusive, disse espontaneamente: “como eu sou trouxa!”, logo no início da sua fala.

Uns dizem que é empatia, outros moral, e outros que sou trouxa.

Meu deus, como é bom ser trouxa.

O dilema da privacidade

Quase todos utilizamos de diversos serviços gratuitos: e-mail, mensageiro instantâneo, redes sociais, armazenamento de fotos, e muitos outros (vide GMail, Outlook.com, Google Photos, Onedrive, Google Drive, iCloud, Facebook, Whatsapp, etc). Todavia, é sabido que a gratuidade destes sistemas é falsa, pois, apesar de não dispendermos de dinheiro para utilizá-los, cedemos informação. Essa informação é utilizada pelas empresas que fornecem esses serviços “gratuitos” para seu próprio lucro, bem como manutenção de seus serviços.

O Google, por exemplo, pode utilizar toda a informação cedida em buscas, e-mail, etc para traçar um perfil seu, e exibir os melhores anúncios de produtos e serviços, ou seja, os que mais se direcionam ao seu perfil. Os anunciantes, por sua vez, são quem efetivamente pagam ao Google para anunciar seus produtos.

Assim sendo, diversas gigantes do software possuem hoje detalhados perfis de nosso dia a dia, nossas preferência. Google, Microsoft, Apple, Facebook, e muitas outras tem uma infinidade de dados que podem ser utilizados; cada uma dessas empresas tem, geralmente, uma política de privacidade que versa quando e como esses dados serão utilizados.

Todavia, devemos nos preocupar com toda essa informação armazenada nas mãos de um pequeno grupo de empresas?

O argumento da vigilância governamental/de terceiros

Muitos defendem que não devíamos ceder tanta informação em troca de serviços, pois a concentração de dados nas mãos de uma empresa facilitaria a vigilância governamental desses dados. Escândalos recentes dão conta da colaboração entre empresas e governos.

Todavia, outras correntes afirmam que o cidadão usual e não-criminoso não teria nada a temer pela vigilância desses dados, pois, se não cometeu crime, não será punido pelo conteúdo de seus dados.

Entretanto, é válido notar outro argumento: o de que, na eventualidade de ascensão de um regime autoritário, os governos conseguiriam facilmente espionar e perseguir cidadãos de interesse, simplesmente por suas visões políticas.

Ainda, há os que não temem uma vigilância governamental, mas sim que os dados caiam em mãos de pessoas mal-intencionadas. Já ocorreu, e pode ocorrer de novo. Nesse caso, seria conveniente que dados tão pessoais não ficassem expostos da forma como ficam hoje.

O argumento do uso de dados para lucro de terceiros

Há grupos que defendem que o lucro obtido sobre a exploração de dados dos usuários seria espúrio ou desonesto, e que propagandas deveriam ser direcionadas a pessoas sem levar em conta as suas preferâncias. Também, que a manutenção de um perfil traçando a personalidade de cada usuário seria uma invasão à privacidade, pois cada pessoa tem seus segredos, mesmo que não sejam crimes.

Entretanto é útil notar que as propagandas direcionadas não só obtiveram melhores resultados ao longo da história, mas também são melhor toleradas por quem as vê, visto que são produtos que correspondem aos seus interesses.

O argumento da praticidade

Hoje temos diversas ferramentas para (tentar) garantir nossa privacidade online. Há mensageiros instantâneos como o Signal que utilizam o estado-da-arte de segurança de dados para comunicação. Temos o PGP, que nos permite enviar e-mails assinados digitalmente, e até mesmo criptografá-los. Temos complementos de navegador que impedem trackers ao longo da internet.

Todavia, para cada um desses, é necessário algum esforço de instalação e configuração que não são triviais nem para um usuário habituado com tecnologia, logo, imagine para um usuário comum. Além disso, quando é para comunicação, as duas pontas (emissor e receptor) precisam estar utilizando das mesmas tecnologias.

Sendo assim, a maioria dos usuários não utiliza dessas ferramentas, por não serem práticas (out-of-the-box), e elas acabam sendo utilizadas apenas por pequenos grupos que compartilham desses interesses.

Há alternativas sendo criadas e evoluindo, como o ProtonMail, cuja proposta é adicionar os layers de segurança necessários, sem que o usuário comum sequer saiba disso. Mas ainda são embriões, não são perfeitos, e a resistência à mudança é grande.

O argumento da gratuidade

Sabemos que não há almoço grátis. Se o serviço que utilizamos não exige pagamento, ele explorará nossos dados. Alguns defendem que, afim de garantir nossa privacidade, valeria a pena começarmos a pagar para utilizar esses serviços, mediante garantia de privacidade. Outros dizem que preferem ceder a informação e, assim, poder usar seu dinheiro com coisas que lhe tragam outros benefícios.

Afinal, devemos nos preocupar?

Não há resposta universal. Cada um de nós terá de realizar tal julgamento, pessoalmente. Vale a pena arriscarmos dados pessoais em prol de gratuidade e praticidade? Ou devemos investir tempo configurando ferramentas que protegem nossos dados e não são tão práticas? Mas não será um disperdício de tempo? E se as pessoas com as quais nos comunicamos não tem a mesma sintonia, vale a pena investir nessas tecnologia? Mas e se um dia formos chantageados pela informação que colocamos na nuvem?

Nosso perfil somos nós. Cada um de nós terá de ver o quanto vale, e se queremos nos arriscar a uma exposição que, talvez seja danosa, ou talvez nunca traga diferença alguma.

O compartilhamento de dados entre WhatsApp e Facebook não é coisa nova

Foi feito um alarde essa semana referente ao anúncio do Facebook de que os dados dos usuários de WhatsApp serão compartilhados com a rede social. Há inclusive agora, no WhatsApp, um toggle que permite desabilitar o compartilhamento.

Todavia, esse compartilhamento de dados já era realizado. O toggle para desabilitar, de fato, é novo.

No ano passado, quando eu ainda tinha uma conta de Facebook, o número de telefone associado à minha conta era o mesmo número que utilizo no WhatsApp. Todavia, não tinha app do Facebook no smartphone, tampouco acessava a rede social via browser mobile, nada. Não entrava no facebook de forma alguma no celular. Isso justamente para evitar que a rede social me perguntasse se eu queria fazer o upload dos meus contatos e ver quem eu conhecia. Eu preferia adicionar um a um, e manter a minha lista de contatos “privada”.

A bem da verdade, só utilizava o Facebook no browser do notebook, em casa.

Um colega de trabalho, então, me passou o telefone de uma corretora imobiliária. Adicionei em meu telefone, o WhatsApp viu o número, colocou entre os contatos de WhatsApp, conversei com ela pelo mesmo app.

Ao chegar em casa à noite, entrei no Facebook no notebook, e para minha surpresa, ele exibia na página inicial o banner “Pessoas que talvez você conheça”. A primeira delas era a corretora imobiliária, pessoa que eu conheci no mesmo dia.

Muitos dirão:

“Ah, mas o compartilhamento de dados pode não ter se dado pelo teu WhatsApp, mas pelo smartphone dela. Ela tinha ambos os apps no smartphone dela (Facebook e WhatsApp), ela ‘syncava’ os contatos entre o smartphone e o Facebook, e o Facebook entendeu então que ela te conhecia, e sugeriu para os dois se adicionarem…” – Você espertalhão conhecedor dos paranauês tecnológicos

Ok, tecnicamente possível. Todavia, em minha opinião, o máximo que se deveria fazer era exibir para ELA, no Facebook DELA, que talvez ELA ME conhecesse. Exibir para mim é muita intrusão, pois eu tornei o compartilhamento de meus contatos impráticável (jamais autorizando o upload de meus contatos, e sequer tendo o app do Facebook). Acho, inclusive, que sugerir pessoas que eu conheça é questionável, se jamais permiti o upload de meus contatos pra rede social.

De qualquer forma, privacidade hoje é, na prática, inexistente. Os seus dados vão parar lá, de uma forma ou de outra. Seja pelo seu smartphone, seja pelo do coleguinha.

É o que eu acho.

Obsolescência Programada

Ou: Como as Fabricantes o Forçam a Comprar as Novas Versões Ou: Tática Chaves de Venda de Balões

Quando você compra um eletrônico (como smartphones, tablets ou até notebooks), após um certo tempo, o fabricante geralmente lança atualizações de software que, sabidamente, vão prejudicar o desempenho do seu dispositivo.

Até então ele estava funcionando perfeitamente mas, com a nova versão, torna-se lento, ou às vezes inutilizável. A saída é apenas uma: comprar outro aparelho mais novo que suporte melhor essas novas versões e com desempenho aceitável.

Após algum tempo, lançam novas atualizações para este aparelho novo, que torna-se lento, e assim segue o ciclo. Essa é a famosa Obsolescência Programada.

Todos somos vítimas dela. Eu fui vítima dela quando comprei um iPhone 3GS por exemplo. Excelente aparelho, rápido. Com o tempo, novas atualizações de software surgiram, e hoje o iPhone 3GS jaz em uma gaveta pois, afinal, é impraticável utilizá-lo: é lento, trava.

Por que não deixaram como versão máxima para ele uma versão na qual ele ainda funcionava rapidamente? Para forçar o usuário a comprar outro modelo mais novo.

Isso ocorre também com smartphones Android, Windows Phone, com tablets, computadores, etc. Independe da marca.

Como se proteger? Duas opções:

  1. Pesquise antes de atualizar. Se usuários relatam perda de desempenho, não atualize. Continue na versão antiga.
  2. Recorra a um sistema operacional alternativo. Usuários de Android costumam dar sobrevida a aparelhos aparentemente obsoletos com ROMs alternativas como o Cyanogenmod, por exemplo. Isso mantém o aparelho atualizado, e algumas vezes mais rápido do que ele era de fábrica. Testei isso num Samsung Galaxy S3 e foi impressionante. Para computadores, vale tentar usar uma distribuição linux e salvar a máquina antiga. Eu uso Debian em meu notebook já um tanto antigo e fraco, e é ótimo.

Por que estou escrevendo sobre isso? Na segunda-feira, percebi que a Apple me oferecia gratuitamente uma atualização para meu Mac Mini de 5 anos (modelo de 2010) para seu novíssimo sistema Mac OS X El Capitan.

Há algum tempo atrás, me ofereceram a atualização para o então novíssimo Yosemite, que prejudicou consideravelmente o desempenho de meu computador até então 100% funcional. E na terça, a Apple anuncia os novíssimos preços para seus computadores: cifras astronômicas.

Atualizarei? Provavelmente não. Na verdade, acho que vou tentar regredir para uma versão anterior para obter o funcionamento pleno novamente.

Se atualizasse, ficaria inutilizável, aposto. O que fazer nesse caso? Comprar outro.

O Chaves e o Sr. Madruga desenvolveram um sistema infalível para venda de balões.

  1. O Sr. Madruga vendia um balão.
  2. O Chaves espetava o balão do cliente quando o Sr. Madruga já tivesse o dinheiro no bolso.
  3. Quando o cliente atônito perguntava o que deveria fazer, o Chaves disparava: comprar outro.

Em tempos de crise, convém evitar que seu aparelho funcional torne-se obsoleto. Em tempos de bonança, também. Vamos evitar o consumismo desenfreado. Salve seu hardware funcional com software que funciona nele e que lhe atenda.

Instalando Phalcon Framework no Debian 8 64 bits

O Phalcon é um Framework PHP de alto desempenho, pois ele é uma extensão compilada do PHP. Assim, suas classes residem já na memória do PHP por padrão, não sendo carregadas por interpretação de arquivos PHP. Isso nos provê um altíssimo desempenho e menor consumo de memória.

Este guia nos mostra como instalar o Phalcon em 5 minutos em sua máquina Debian 8 64 bits.

  • Atualize seus repositórios
    • sudo apt-get update
  • Instale os pacotes necessários à compilação e utilização da extensão
    • sudo apt-get install php5-dev libpcre3-dev gcc make php5-mysql git
  • Inicie a compilação do pacote
    • cd /opt
    • sudo git clone --depth=1 git://github.com/phalcon/cphalcon.git
    • cd cphalcon/build
    • sudo ./install
  • Aguarde o fim da compilação
    • Thanks for compiling Phalcon!
    • Build succeed: Please restart your web server to complete the installation
  • Crie os arquivos de carregamento da extensão
    • sudo printf "; configuration for phalcon module\n; priority=50\nextension=phalcon.so" > /etc/php5/cli/conf.d/50-phalcon.ini
    • sudo printf "; configuration for phalcon module\n; priority=50\nextension=phalcon.so" > /etc/php5/apache2/conf.d/50-phalcon.ini
  • Crie um arquivo phpinfo para conferir se a extensão será carregada
    • sudo printf "<?php\nphpinfo();" > /var/www/html/phpinfo.php
  • Reinicie o apache
    • sudo service apache2 restart
  • Carregue no seu navegador o phpinfo na URL http://localhost/phpinfo.php

Se apareceu o phalcon na página do phpinfo, pronto! Sua instalação está pronta e rodando corretamente.

Performance e Otimização de Bancos de Dados MySQL

O seguinte Webinar foi apresentado ao vivo em 23/09/2015 pela empresa KingHost. Nele, eu – Jeronimo Fagundes – e Rodrigo Paris falamos sobre as melhores práticas para obter o máximo desempenho ao realizar buscas em um servidor MySQL, afim de tornar sua aplicação mais rápida, e melhorando a usabilidade da mesma.

São apresentados 4 pontos-chave:

  1. Indexação de tabelas
  2. Particionamento de tabelas
  3. Otimização de consultas
  4. Infraestrutura

Aprimorando o particionamento em MySQL – Subpartições

Dando seguimento ao post anterior sobre particionamento de tabelas no MySQL, este post explica um passo a mais: subparticionamento.

O MySQL permite que você particione uma partição, onde o primeiro nível (PARTITION) é definido por uma expressão de particionamento, e o nível inferior (SUBPARTITION) é definido por outra.

Para utilizar o subparticionamento, é necessário seguir duas restrições:

  1. O tipo de particionamento (PARTITION) precisa ser dos tipos RANGE ou LIST;
  2. O tipo de particionamento (SUBPARTITION) precisa ser dos tipos HASH ou INDEX.

Portanto, não é possível subparticionar tabelas particionadas por HASH ou INDEX.

É importante notar que o número total de partições de uma tabela (nº de PARTITIONs * nº de SUBPARTITIONs) não pode ultrapassar 1024, que é o máximo que o MySQL suporta. Ex.: se uma tabela é particionada por RANGE em 2 partições, cada partição pode ser subparticionada em 512, pois 2 * 512 = 1024.

Abaixo segue um exemplo de tabela subparticionada:

CREATE TABLE ts (
id INT,
purchased DATE
) PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) )
SUBPARTITIONS 2 (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE
);

No exemplo acima a tabela ts possui 3 partições, e cada uma é subparticionada em 2 partições. Assim, temos 6 partições no total.

Veja outro exemplo:

CREATE TABLE ts (
id INT,
purchased DATE
)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
PARTITION p0 VALUES LESS THAN (1990) (
SUBPARTITION s0,
SUBPARTITION s1
),
PARTITION p1 VALUES LESS THAN (2000) (
SUBPARTITION s2
),
PARTITION p2 VALUES LESS THAN MAXVALUE (
SUBPARTITION s3,
SUBPARTITION s4
)
);

Neste outro exemplo, a tabela ts tem 5 partições no total, pois as partições p0 e p2 são subparticionadas em 2 partições cada, mas a partição p1 tem apenas uma subpartição.

Para saber mais sobre o subparticionamento em MySQL, consulte a documentação oficial do MySQL sobre subparticionamento.

Acelerando suas queries com o particionamento do MySQL

Quando você tem uma tabela com muitos registros no MySQL, as buscas podem se tornar extremamente lentas. Uma forma de otimizar a velocidade de suas buscas pode ser particionar a tabela.

Quando uma tabela é particionada, é como se você tivesse várias tabelinhas menores que, juntas, compõem a tabela completa.

Esta divisão é feita de acordo com algum critério lógico, de forma que quando você realize uma busca, o MySQL busque em apenas uma tabelinha, e não no universo todo de dados. Você não tem mais um grande universo de dados, mas vários “universinhos”. Como seu universo de busca se torna menor, a busca fica mais rápida.

O critério lógico de particionamento sempre é definido com base nos valores de uma ou mais colunas predeterminadas. Dependendo dos valores que essas colunas assumirem, uma row é guardada em uma ou em outra partição. Assim, quando formos buscar um conjunto de dados via SELECT, dependendo dos valores especificados para aquelas colunas na cláusula WHERE, sabemos exatamente em quais partições os dados se encontram, e assim evitamos a busca nas demais partições.

Há diversos tipos de particionamento no MySQL. Cada um atende a um tipo de critério lógico de particionamento.

Particionamento por RANGE

No particionamento por RANGE, o MySQL decide quais rows vão em uma partição de acordo com um intervalo de valores de uma coluna (ou expressão baseada em colunas). Na seguinte tabela:

CREATE TABLE Funcionarios ( cpf VARCHAR(14) NOT NULL, nome VARCHAR(255) NOT NULL, admissao DATE NOT NULL PRIMARY KEY (cpf) ) PARTITION BY RANGE(MONTH(admissao)) ( PARTITION primeiro_trimestre VALUES LESS THAN (4), PARTITION segundo_trimestre VALUES LESS THAN (7), PARTITION terceito_trimestre VALUES LESS THAN (10), PARTITION quarto_trimestre VALUES LESS THAN MAXVALUE );

Definimos 4 partições baseadas no mês da asmissão:

A partição primeiro_trimestre vai conter todos os registros de funcionários cuja admissão ocorreu nos meses 1, 2 ou 3 (janeiro, fevereiro ou março), ou seja, segundo a definição, todos os meses menores que 4. A partição segundo_trimestre conterá todos os registros de funcionários cujo mês de admissão é maior ou igual a 4 e menor que 7, ou seja, os meses de abril, maio e junho. A partição terceiro_trimestre conterá os registros de funcionários admitidos nos meses 7, 8 e 9, ou seja, julho, agosto e setembro. A partição quarto_trimestre conterá os registros dos demais funcionários. Assim, caso o seguinte select fosse feito:

SELECT * FROM Funcionarios WHERE admissao = '2015-03-15';

o MySQL saberia automaticamente que teria que procurar apenas na partição primeiro_trimestre, e não consideraria as outras partições na busca. O universo de busca fica muito menor, e a query mais rápida.

É importante notar que na expressão PARTITION BY (expr), expr deve ser uma expressão que retorne necessariamente um valor inteiro.

Particionamento por LIST

O particionamento por LIST é bem parecido com o RANGE. Todavia, em vez de especificarmos um intervalo de valores, vamos especificar um conjunto discreto de valores, fixos, predeterminados.

CREATE TABLE Funcionarios ( cpf VARCHAR(14) NOT NULL, nome VARCHAR(255) NOT NULL, filial INT NOT NULL PRIMARY KEY (cpf) ) PARTITION BY LIST(filial) ( PARTITION regiao_norte VALUES IN (1, 2, 7), PARTITION regiao_sul VALUES IN (3, 9), PARTITION regiao_leste VALUES IN (4, 5, 6), PARTITION regiao_oeste VALUES IN (8), );

Neste exemplo, se buscássemos todos os funcionários da filial número 5, o MySQL buscaria apenas na partição regiao_leste, que contém os funcionários das filiais 4, 5 e 6.

Particionamento por RANGE COLUMNS

É igual ao particionamento com RANGE, mas a expressão de particionamento pode ser de outros tipos que não um número inteiro, a saber: DATE, DATETIME, CHAR, VARCHAR, BINARY e VARBINARY. Além disso, pode-se usar tuplas de colunas em vez de uma só coluna.

CREATE TABLE xyz ( a INT NOT NULL, b INT NOT NULL, c DATETIME NOT NULL ) PARTITION BY RANGE COLUMNS (a, MONTH(c)) ( PARTITION p0 VALUES LESS THAN (3, 7), PARTITION p1 VALUES LESS THAN (4, 9), PARTITION p2 VALUES LESS THAN (4, 11), PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE) );

Neste exemplo, se buscássemos por uma row em que a = 4 e c = ‘2015-10-01′, o MySQL buscaria na partição p2. Já uma row em que a = 4 e c = ‘2015-11-20′ estaria na partição p3.

Particionamento por LIST COLUMNS

Assim como o RANGE COLUMNS é uma extensão do RANGE, o LIST COLUMNS é uma extensão do LIST. Ele também permite que a expressão de particionamento seja de outros tipos, e também permite tuplas.

CREATE TABLE Funcionarios ( cpf VARCHAR(14) NOT NULL, estadoVARCHAR(2) NOT NULL DEFAULT 'RS', PRIMARY KEY (cpf) ) PARTITION BY LIST COLUMNS (estado) ( PARTITION regiao_sul VALUES IN ('RS', 'SC, 'PR'), PARTITION regiao_sudeste VALUES IN ('SP', 'RG', 'MG', 'ES'), PARTITION regiao_centro_oeste VALUES IN ('MT', 'MS', 'GO', 'DF'), PARTITION regiao_norte VALUES IN ('AC', 'AM', 'RO', 'RR', 'PA', 'AP', 'TO'), PARTITION regiao_nordeste VALUES IN ('MA', 'PI', 'CE', 'RN', 'PB', 'PE', 'AL', 'SE', 'BA') );

Particionamento por HASH ou por LINEAR HASH

O particionamento por HASH é um dos mais simples, e de uso mais comum. A sua expressão de particionamento deve ser um valor inteiro. Neste tipo de particionamento, você deve especificar não só a expressão de particionamento, mas também o número de partições a utilizar. O MySQL vai nomear essas partições automaticamente, e vai escolher a melhor partição para sua row de acordo com o módulo da expressão de particionamento pelo número de partições. Esse é o tipo de particionamento recomendado se você quer ter uma distribuição semelhante de rows entre as partições.

CREATE TABLE Pedidos ( idNOT NULL AUTO_INCREMENT, id_cliente INT NOT NULL, valor DECIMAL(5, 2) NOT NULL, descricao VARCHAR(255) NOT NULL ) PARTITION BY HASH (id_cliente) PARTITIONS 10;

Neste exemplo, criamos 10 partições por id de cliente. Isso significa, por exemplo, que todos os pedidos do cliente com id 7 vão residir na partição 7, pois 7 % 10 = 7 (sete módulo dez é igual a sete). Já os pedidos do cliente 22 estarão todos na partição 2, pois 22 % 10 = 2.

O número máximo de partições por tabela que o MySQL permite é 1024.

O particionamento por LINEAR HASH é muito semelhante ao por HASH. Todavia, em vez do módulo, o MySQL usa outra fórmula baseada em potências de 2.

Particionamento por KEY ou por LINEAR Key

Muito parecida com a partição por HASH. Todavia, no particionamento por KEY, o MySQL server é que vai escolher o melhor algoritmo para o cálculo da partição resultante.

A expressão de particionamento pode ser zero ou mais colunas, conforme segue:

Se não é especificada nenhuma coluna, o MySQL vai usar a chave primária se houver; se não houver chave primária, vai usar uma chave única que houver. Se houver colunas especificadas, elas precisam fazer parte da chave primária ou da chave única. LINEAR KEY é semelhante à KEY, usando cálculo de potências de 2 (assim como LINEAR HASH).

Um cuidado deve ser tomado: se você efetuar uma busca (SELECT) e não especificar na cláusula WHERE o valor da coluna de particionamento, o MySQL não vai saber em qual partição buscar, e vai acabar varrendo todas as partições para efetuar sua busca. Isso será mais lento que buscar em uma tabela não-particionada. Assim sendo, o particionamento é uma poderosa ferramenta, mas suas queries terão de ser adaptadas para aproveitar esse particionamento.

Quer saber mais sobre particionamento no MySQL? Consulte a documentação oficial do MySQL sobre particionamento.