high perform MYSQL-TRANSAÇÕES

Embed Size (px)

Citation preview

Captulo 1

arquitetura do MySQl

A arquitetura do MySQL muito diferente da dos outros servidores de banco de dados e til para uma grande variedade de objetivos. MySQL no perfeito, mas flexvel o suficiente para trabalhar bem em ambientes muito exigentes, como aplicaes web. Ao mesmo tempo, MySQL pode potencializar aplicaes embutidas, depsitos de dados, indexao de contedo e software de distribuies, sistemas redundantes altamente disponveis, processamento de transao on-line (OLTP), e muito mais. Para obter o mximo do MySQL, voc precisa entender seu design para que voc possa trabalhar com ele, no contra ele. MySQL flexvel de diversas maneiras. Por exemplo, voc pode configur-lo para rodar bem em ampla variedade de hardware e suportar uma variedade de tipos de dados. Porm, a caracterstica mais importante e incomum do MySQL sua arquitetura de ferramenta de armazenamento, cujo design separa o processamento da consulta e outras tarefas do servidor do armazenamento de dados e recuperao. No MySQL 5.1, voc pode at carregar ferramentas de armazenamento como plugins em tempo de execuo. Esta separao de interesses permite que voc escolha, em uma base por tabela, como seus dados so armazenados e qual desempenho, atributos e outras caractersticas voc quer. Este captulo oferece uma viso geral de alto nvel da arquitetura do servidor MySQL, as maiores diferenas entre as ferramentas de armazenamento, e por que estas diferenas so importantes. Ns tentamos explicar o MySQL simplificando os detalhes e mostrando exemplos. Esta discusso ser til para aqueles novos em servidores de banco de dados, assim como para os leitores que so especialistas com outros servidores de banco de dados.

arquitetura lgica do MySQlUma boa imagem mental de como os componentes do MySQL trabalham juntos vai te ajudar a entender o servidor. A Figura 1-1 mostra uma viso lgica da arquitetura do MySQL. A camada superior contm os servios que no so exclusivos do MySQL. Eles so servios que a maioria das ferramentas cliente/servidor baseadas em rede ou servidores precisa: gerenciamento de conexo, autenticao, segurana e assim por diante.

|

1

Figura 1-1. Uma viso lgica da arquitetura do servidor MySQL. A segunda camada onde as coisas ficam interessantes. A maior parte do crebro do MySQL est aqui, incluindo o cdigo para interpretar consulta, anlise, otimizao, cache e todas as funes embutidas (por exemplo, datas, horas, matemtica e codificao). Toda funcionalidade oferecida atravs das ferramentas de armazenamento fica neste nvel: procedimentos armazenados, triggers e visualizaes, por exemplo. A terceira coluna contm as ferramentas de armazenamento. Elas so responsveis por armazenar e recuperar todos os dados no MySQL. Como os diversos sistemas de arquivo disponveis para GNU/ Linux, cada ferramenta de armazenamento possui seus prprios benefcios e desvantagens. O servidor comunica-se com elas atravs da API da ferramenta de armazenamento. Esta interface esconde diferenas entre ferramentas de armazenamento e as tornam amplamente transparentes na camada de consulta. A API contm vrias funes de baixo nvel que realiza operaes como iniciar uma transao ou trazer a linha que contm a linha primria. As ferramentas de armazenamento no interpretam SQL* nem se comunicam umas com as outras; elas simplesmente respondem s requisies do servidor.

Gerenciamento de Conexo e SeguranaCada conexo de cliente obtm sua prpria thread dentro do processo do servidor. As consultas da conexo dentro daquela nica thread, que consequentemente habita em uma central ou CPU. O servidor faz cache de threads, para que elas no precisem ser criadas e destrudas para cada nova conexo**. Quando clientes (aplicaes) conectam-se ao servidor MySQL, o servidor precisa autentic-las. Autenticao baseada no nome do usurio, hospedeiro de origem e senha. Certificados X.509 tambm podem ser usados atravs de uma conexo Secure Sockets Layer (SSL Camadas de Tomadas Seguras). Depois de um cliente conectar-se, o servidor verifica se o cliente tem privilgios para cada consulta que ele executa (exemplo: se o cliente tem permisso para executar uma expresso SELECT que acessa a tabela Country no banco de dados world). Ns abordamos estes tpicos em detalhes, no Captulo 12.

* Uma exceo InnoDB, que interpreta definies de chave estrangeira, porque o servidor MySQL ainda no as implementa. ** MySQL AB planeja separar conexes das threads em uma futura verso do servidor. 2 | Captulo 1: arquitetura do MySQl

otimizao e ExecuoMySQL interpreta consultas para criar uma estrutura interna (a rvore de interpretao), e, ento, aplica uma variedade de otimizaes. Estas podem incluir reescrever a consulta, determinar a ordem na qual ela vai ler as tabelas, escolher quais ndices usar e assim por diante. Voc pode passar dicas ao otimizador por meio de palavras-chave especiais na consulta, afetando seu processo de tomada de deciso. Voc tambm pode pedir ao servidor para explicar vrios aspectos da otimizao. Isso permite que voc saiba quais decises o servidor est tomando e d a voc um ponto de referncia para repetir consultas, esquemas e configuraes para fazer tudo rodar o mais eficientemente possvel. Ns discutimos o otimizador com mais detalhes no Captulo 4. O otimizador realmente no se importa por qual ferramenta de armazenamento uma tabela particular usa, mas a ferramenta de armazenamento realmente afeta como o servidor otimiza a consulta. O otimizador pergunta ferramenta de armazenamento sobre algumas das suas capacidades e o custo de certas operaes, e pede por estatsticas sobre os dados da tabela. Por exemplo, algumas ferramentas de armazenamento suportam tipos de ndice que podem ser teis para certas consultas. Voc pode ler mais sobre indexao e otimizao de esquema no Captulo 3. Antes mesmo de interpretar a consulta, porm, o servidor consulta o cache de consulta, que pode armazenar somente expresses SELECT, junto com seus conjuntos de resultado. Se algum executar uma consulta que idntica quela que j est no cache, o servidor no precisa interpretar, otimizar ou executar a consulta ele pode simplesmente passar de volta o conjunto de resultado armazenado! Ns discutimos o cache de consulta ao longo de O Cache de Consulta do MySQL, na pgina 171.

Controle de ConcorrnciaToda vez que mais de uma consulta precisar alterar dados ao mesmo tempo, o problema de controle de concorrncia surge. Para nossos propsitos neste captulo, MySQL tem de fazer isso em dois nveis: no nvel do servidor e no nvel da ferramenta de armazenamento. Controle de concorrncia um grande tpico para o qual um grande corpo da literatura terica devotado, mas este livro no sobre teoria ou, at mesmo, sobre as internalidades do MySQL. Assim, ns vamos dar a voc somente uma viso geral simplificada de como MySQL lida com leitores e escritores concorrentes, ento voc ter o contexto necessrio para o resto deste captulo. Ns usaremos uma caixa de e-mail em um sistema Unix como um exemplo. O clssico formato de arquivo mbox muito simples. Todas as mensagens na caixa de e-mail mbox so concatenadas juntas, uma depois da outra. Isso torna muito fcil ler e interpretar mensagens de e-mail. Tambm torna a entrega do e-mail mais fcil: apenas anexe uma nova mensagem no final do arquivo. Mas o que acontece quando dois processos tentam entregar mensagens ao mesmo tempo na mesma caixa de e-mail? Claramente isso pode corromper a caixa de e-mail, deixando duas mensagens vazias no final do arquivo da caixa de e-mail. Sistemas de entrega de e-mail bem comportados usam bloqueio para evitar corrupo. Se um cliente tentar uma entrega secundria enquanto a caixa de e-mail estiver bloqueada, ele deve esperar para adquirir o prprio bloqueio antes de entregar sua mensagem. Este esquema funciona razoavelmente bem na prtica, mas no d nenhum suporte para concorrncia. Porque somente um nico processo pode modificar a caixa de e-mail a qualquer dado horrio, esta abordagem torna-se problemtica com uma caixa de entrada de alto volume.

Bloqueios de leitura/EscritaLer a partir da caixa de e-mail no um problema. No h nada de errado em mltiplos clientes lerem a mesma caixa de e-mail simultaneamente; porque eles no esto fazendo alteraes, no h probabilidade de algo dar errado. Mas o que acontece se algum tentar deletar a mensagem nmero 25 enquanto programas esto lendo a caixa de e-mail? Depende, mas um leitor pode ter uma visualizao corrompida ouControle de Concorrncia | 3

inconsistente da caixa de entrada. Ento, por segurana, at mesmo ler a partir de uma caixa de e-mail requer cuidado especial. Se voc considera a caixa de e-mail como uma tabela de banco de dados e cada mensagem de e-mail com uma linha, fcil ver que o problema o mesmo neste contexto. De muitas maneiras, uma caixa de e-mail , realmente, uma simples tabela de banco de dados. Modificar linhas em uma tabela de banco de dados muito similar a remover ou modificar o contedo das mensagens no arquivo de caixa de e-mail. A soluo para este problema clssico de controle de concorrncia muito simples. Sistemas que lidam com acesso de leitura/escrita concorrente tipicamente implementam um sistema de bloqueio que consiste em dois tipos de bloqueio. Estes so geralmente conhecidos como bloqueios compartilhados e bloqueios exclusivos, ou bloqueios de leitura e bloqueios de escrita. Sem nos preocuparmos sobre a atual tecnologia de bloqueio, podemos descrever o conceito como segue. Bloqueios de leitura em um recurso so compartilhados, ou mutuamente no-bloqueveis: muitos clientes podem ler a partir de um recurso ao mesmo tempo e no interferir uns com os outros. Bloqueios de escrita, por outro lado, so exclusivos por exemplo, eles bloqueiam leitura e outros bloqueiam escritas porque a nica poltica segura ter um nico cliente escrevendo no recurso em um dado tempo e evitar todas as leituras quando um cliente estiver escrevendo. No mundo do banco de dados, bloqueio ocorre o tempo todo: MySQL tem de impedir que um cliente leia uma poro de dados enquanto outro esteja modificando-a. Ele executa este gerenciamento de bloqueio internamente de uma maneira que seja transparente a maior parte do tempo.

Granularidade de BloqueioUma maneira de melhorar a concorrncia de um recurso compartilhado ser mais seletivo sobre o que voc bloqueia. Em vez de bloquear todo o recurso, bloqueie somente a parte que contm os dados que voc necessita alterar. Melhor ainda, bloqueie somente a poro exata dos dados que planeja alterar. Minimizar a quantidade de dados que voc bloqueia de uma vez permite que alteraes a um dado recurso ocorram simultaneamente, desde que elas no se conflitem com as outras. O problema que bloqueios consomem recursos. Toda operao de bloqueio obter um bloqueio, checar para ver se um bloqueio est liberado, liberar um bloqueio e assim por diante causa problemas. Se o sistema gastar muito tempo gerenciando bloqueios em vez de armazenar e restaurar dados, o desempenho pode sofrer. Uma estratgia de bloqueio um acordo entre problemas de bloqueio e segurana de dados, e esse acordo afeta desempenho. A maioria dos servidores de banco de dados comerciais no d a voc muita escolha: voc obtm o que conhecido como bloqueio a nvel de linha nas suas tabelas, com uma variedade de maneiras normalmente complexas para dar bom desempenho com muitos bloqueios. MySQL, por outro lado, oferece escolhas. Sua ferramenta de armazenamento pode implementar suas prprias polticas de bloqueio e granularidades de bloqueio. Gerenciamento de bloqueio uma deciso muito importante no design de ferramenta de armazenamento; fixar a granularidade em certo nvel pode gerar melhor desempenho para certos usos, embora torne esta ferramenta menos adequada para outros propsitos. Por MySQL oferecer mltiplas ferramentas de armazenamento, ele no exige uma nica soluo de objetivo geral. Vamos dar uma olhada nas duas mais importantes estratgias de bloqueio.

Bloqueios de tabelaA estratgia mais bsica de bloqueio disponvel no MySQL, e a com menor risco de problemas, bloqueios de tabela. Um bloqueio de tabela similar aos bloqueios de caixa de e-mail descritas anteriormente: ele bloqueia a tabela inteira. Quando um cliente deseja escrever em uma tabela (inserir, deletar, atualizar etc), ele adquire um bloqueio de escrita. Isso coloca todas as outras operaes de leitura e escrita4 | Captulo 1: arquitetura do MySQl

em dificuldades. Quando ningum est escrevendo, leitores podem obter bloqueios de leitura, que no entram em conflito com outros bloqueios de leitura. Bloqueios de tabela possuem variaes para bom desempenho em situaes especficas. Por exemplo, os bloqueios de tabela READ LOCAL permitem alguns tipos de operaes de escrita concorrentes. Bloqueios de escrita tambm tm uma prioridade maior do que bloqueios de leitura, ento uma solicitao de um bloqueio de escrita vai avanar para a frente da fila de bloqueio mesmo se os leitores j estiverem na fila (bloqueios de escrita podem passar bloqueios de escrita na fila, mas bloqueios de escrita no podem passar adiante dos bloqueios de escrita). Embora ferramentas de armazenamento possam gerenciar seus prprios bloqueios, MySQL usa tambm uma variedade de bloqueios que esto efetivamente em nvel de tabela para vrios propsitos. Por exemplo, o servidor usa um bloqueio em nvel de tabela para expresses como ALTER TABLE, independente da ferramenta de armazenamento.

Bloqueios de linhaO estilo de bloqueio que oferece a maior concorrncia (e carrega o maior risco de problemas) o uso de bloqueios de linha. Bloqueio em nvel de linha, como esta estratgia conhecida, est disponvel nas ferramentas de armazenamento InnoDB e Falcon, entre outros. Bloqueios de linha so implementadas na ferramenta de armazenamento, no no servidor (referencie-se de volta ao diagrama de arquitetura lgica se voc precisar). O servidor completo inconsciente de bloqueios implementados nas ferramentas e, como voc ver mais tarde neste captulo e ao longo do livro, as ferramentas de armazenamento todas implementam bloqueio nas suas prprias maneiras.

transaesVoc no pode examinar as caractersticas mais avanadas de um sistema de banco de dados por muito tempo antes de transaes se incorporarem. Uma transao um grupo de consultas SQL que so tratadas atomicamente, como uma unidade nica de trabalho. Se a ferramenta de banco de dados puder aplicar o grupo inteiro de consultas a um banco de dados, ela vai fazer, mas, se alguma delas no puder ser feita por causa de um travamento ou outra razo, nenhuma delas aplicada. tudo ou nada. Um pouco desta seo especfica ao MySQL. Se voc j for familiar com transaes ACID, sinta-se vontade para pular para Transaes no MySQL, na pgina 9, adiante neste captulo. Uma aplicao bancria o exemplo clssico de porque transaes so necessrias. Imagine o banco de dados de um banco com duas tabelas: checking e savings. Para mover $200 da conta de Jane para sua conta poupana, voc precisa executar pelo menos trs passos: 1. Tenha certeza de que o saldo da sua conta seja maior do que $200. 2. Subtraia $200 do saldo da sua conta. 3. Adicione $200 ao saldo da sua conta poupana. Toda a operao deve ocorrer em uma transao para que se algum dos passos falhar, qualquer passo completado possa ser executado novamente. Voc inicia uma transao com a expresso START TRANSACTION e, ento, torna suas alteraes permanentes com COMMIT ou descarta as alteraes com ROLLBACK. Ento, o SQL para nosso exemplo de transao deve parecer assim:1 2 3 4 5 START TRANSACTION; SELECT balance FROM checking WHERE customer_id = 10233276; UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276; UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276; COMMIT;

transaes

|

5

Mas transaes sozinhas no so a histria toda. O que acontece se o servidor de banco de dados travar enquanto executa a linha 4? O cliente provavelmente acabou de perder $200. E se outro processo vier entre as linhas 3 e 4 e remover todo o saldo da conta? O banco deu ao cliente um crdito de $200 sem nem mesmo saber. Transaes no so suficientes a menos que o sistema passe no teste ACID. ACID significa Atomicidade, Consistncia, Isolamento e Durabilidade. Estes so os critrios muito relacionados que um sistema de processamento de transao bem comportado precisa se adaptar: Atomicidade Uma transao deve funcionar como uma nica unidade indivisvel de trabalho para que a transao inteira seja aplicada ou executada de volta. Quando transaes so atmicas, no existe transao parcialmente completada: tudo ou nada. Consistncia O banco de dados deve sempre mover de um estado consistente para o prximo. No nosso exemplo, consistncia garante que um travamento entre as linhas 3 e 4 no resulte em $200 desaparecendo da conta. Porque a transao nunca realizada, nenhuma das alteraes da transao refletida no banco de dados. Isolamento Os resultados de uma transao so, geralmente, invisveis para outras transaes at que a transao esteja completa. Isso garante que se o resumo de uma conta bancria executar depois da linha 3, mas antes da linha 4 no nosso exemplo, ele ainda vai ver os $200 na conta. Quando discutimos nveis de isolamento, voc entender por que dissemos geralmente invisveis. Durabilidade Depois de realizadas, as alteraes de uma transao so permanentes. Isso significa que as alteraes precisam ser registradas para que estes dados no fiquem perdidos em um travamento do sistema. Durabilidade um conceito um pouco confuso, porm, porque h, geralmente, muitos nveis. Algumas estratgias de durabilidade oferecem uma garantia de segurana mais forte do que outras, e nada 100% durvel. Ns discutimos o que durabilidade realmente significa no MySQL em captulos futuros, especialmente em Ajustes de E/S do InnoDB, na pgina 236. Transaes ACID garantem que bancos no percam seu dinheiro. , geralmente, extremamente difcil ou impossvel fazer isso com esta lgica de aplicao. Um servidor de banco de dados compatvel a ACID tem de fazer todos os tipos de coisas complicadas que voc pode no perceber para oferecer garantias ACID. Assim como granularidade de bloqueio aumentada, a desvantagem desta segurana extra que o servidor de banco de dados tem de fazer mais trabalho. Um servidor de banco de dados com transaes ACID tambm geralmente requer mais potncia de CPU, memria e espao de disco do que um sem elas. Como dissemos diversas vezes, aqui onde a arquitetura da ferramenta de armazenamento do MySQL trabalha para sua vantagem. Voc pode decidir se sua aplicao precisa de transaes. Se voc realmente no precisar delas, voc pode ser capaz de obter desempenho melhor com uma ferramenta de armazenamento no-transacional para alguns tipos de consultas. Voc pode ser capaz de usar LOCK TABLES para dar o nvel de proteo que voc precisa sem transaes. Tudo depende de voc.

Nveis de IsolamentoIsolamento mais complexo do que parece. O padro SQL define quatro nveis de isolamento, que regras especficas para quais alteraes so e no so visveis dentro e fora de uma transao. Nveis mais baixos de isolamento tipicamente permitem maior concorrncia e possuem menos riscos de problemas.

6

| Captulo 1: arquitetura do MySQl

Cada ferramenta de armazenamento implementa nveis de isolamento de uma maneira um pouco diferente, e elas no necessariamente se adaptam ao que voc pode esperar se voc estiver acostumado com outro produto de banco de dados (assim, no entraremos em exaustivos detalhes nesta seo). Voc deve ler os manuais para qualquer ferramenta de armazenamento que voc decidir usar. Vamos dar uma rpida olhada nos quatro nveis de isolamento: READ UNCOMMITTED No nvel de isolamento READ UNCOMMITTED, transaes podem visualizar os resultados de transaes no comitadas. Neste nvel, muitos problemas podem ocorrer, a menos que voc realmente saiba o que est fazendo e tenha uma boa razo para faz-lo. Este nvel raramente usado na prtica, porque seu desempenho no muito melhor do que os outros nveis, que possuem muitas vantagens. Ler dados no comitados tambm conhecido como leitura suja. READ COMMITTED O nvel de isolamento padro para a maioria dos sistemas de banco de dados (mas no o MySQL!) READ COMMITTED. Ele satisfaz a simples definio de isolamento usada anteriormente: uma transao ver somente aquelas alteraes feitas por transaes que j eram comitadas quando ela iniciou, e suas alteraes so sero visveis para outras at que ela seja comitada. Este nvel ainda permite o que conhecido como leitura no repetvel. Isso significa que voc pode executar a mesma expresso duas vezes e ver dados diferentes. REPEATABLE READ REPEATABLE READ resolve os problemas que READ UNCOMMITTED permite. Ele garante que qualquer linha que uma transao ler vai parecer a mesma em leituras subsequentes dentro da mesma transao, mas na teoria ainda permite outro problema chato: leituras fantasmas. Simplificando, uma leitura fantasma pode acontecer quando voc seleciona alguns intervalos de linhas, outra transao insere uma nova linha no intervalo e, ento, voc seleciona o mesmo intervalo novamente; voc ver ento a nova linha fantasma. InnoDB e Falcon resolvem o problema de leitura fantasma com controle de concorrncia de verses mltiplas, que explicaremos mais tarde neste captulo. REPEATABLE READ o nvel de isolamento de transao padro do MySQL. As ferramentas de armazenamento InnoDB e Falcon respeitam esta configurao, a qual voc aprender a modificar, no Captulo 6. Algumas outras ferramentas de armazenamento tambm fazem isso, mas a escolha depende da ferramenta. SERIALIZABLE O mais alto nvel de isolamento, SERIALIZABLE, resolve o problema da leitura fantasma forando as transaes a serem ordenadas para que eles no possam possivelmente se conflitar. Em poucas palavras, SERIALIZABLE coloca um bloqueio em cada linha que l. Neste nvel, muitos intervalos e conteno de bloqueio podem ocorrer. Ns raramente vemos pessoas usarem este nvel de isolamento, mas as necessidades da sua aplicao podem te forar a aceitar a baixa concorrncia em favor da estabilidade dos dados em que resulta. A Tabela 1-1 resume os vrios nveis de isolamento e as desvantagens associadas com cada um.

transaes

|

7

Tabela 1-1. Nveis de isolamento ANSI SQLNvel de Isolamento possveis leitura sujas READ ANCOMMITED READ COMMITED REPEATABLE READ SERIALIZABLE Sim No No No possveis leituras no repetveis Sim Sim No No phantom reads possible Sim Sim Sim No leituras de bloqueio No No No Sim

DeadlocksUm deadlock quando duas ou mais transaes esto mutuamente mantendo e solicitando bloqueios nos mesmos recursos, criando um ciclo de dependncias. Deadlocks ocorrem quando transaes tentam bloquear recursos em uma ordem diferente. Eles podem acontecer sempre que mltiplas transaes bloqueiam os mesmos recursos. Por exemplo, considere estas duas transaes sendo executadas na tabela StockPrice: Transao n.1START TRANSACTION; UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01'; UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02'; COMMIT;

Transao n.2START TRANSACTION; UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = '2002-05-02'; UPDATE StockPrice SET high = 47.20 WHERE stock_id = 4 and date = '2002-05-01'; COMMIT;

Se voc no tiver sorte, cada transao vai executar sua primeira consulta e atualizar uma linha de dados, bloqueando-a no processo. Cada transao vai, ento, tentar atualizar sua segunda linha, apenas para descobrir que j est bloqueada. As duas transaes vo esperar eternamente para que cada uma complete, a menos que algo interfira para quebrar o deadlock. Para combater este problema, sistemas de banco de dados implementam vrias formas de deteco de deadlock e intervalos. Os sistemas mais sofisticados, como a ferramenta de armazenamento InnoDB, vai perceber dependncias circulares e retornar um erro instantaneamente. Isso , na verdade, algo muito bom do contrrio, deadlocks iriam se manifestar como consultas muito lentas. Outros vo desistir depois da consulta exceder o tempo limite de espera de um bloqueio, o que no muito bom. A maneira que o InnoDB atualmente lida com deadlocks desfazer a transao que tem o menor nmero de bloqueios de linha exclusivos (uma mtrica aproximada para a qual ser mais fcil desfazer). Ordem e comportamento do bloqueio so especficos ferramenta, ento algumas ferramentas podem deadlock em certa sequncia de expresses mesmo que outras no. Deadlocks possuem uma natureza dupla: alguns so inevitveis por causa dos conflitos de dados verdadeiros, e alguns so causados por como uma ferramenta de armazenamento trabalha. Deadlocks no podem ser quebrados sem desfazer uma das transaes, seja parcialmente ou totalmente. Eles so fatos reais em sistemas transacionais, e suas aplicaes devem ser desenvolvidas para lidar com eles. Muitas aplicaes podem, simplesmente, testar novamente suas transaes desde o comeo.

8

| Captulo 1: arquitetura do MySQl

log de transaesLog de transaes ajudam a tornar as transaes mais eficientes. Em vez de atualizar as tabelas no disco toda vez que uma alterao ocorrer, a ferramenta de armazenamento pode modificar sua cpia em memria dos dados. Isso muito rpido. A ferramenta de armazenamento pode ento escrever um registro da alterao no log de transao, que est no disco e dessa forma durvel. Esta tambm uma relao relativamente rpida, porque anexar eventos de log envolve sequencial E/S em uma pequena rea do disco em vez de E/S aleatria em muitos lugares. Ento, em algum momento no futuro, um processo pode atualizar a tabela no disco. Dessa maneira, a maioria das ferramentas de armazenamento que usa esta tcnica (conhecida como write-ahead logging) acaba escrevendo as mudanas no disco duas vezes*. Se houver um travamento depois da atualizao ser escrita no log de transao, mas antes das alteraes serem feitas nos prprios dados, a ferramenta de armazenamento ainda pode recuperar as alteraes ao reiniciar. O mtodo de recuperao vria entre as ferramentas de armazenamento.

transaes no MySQlMySQL AB oferece trs ferramentas de armazenamento transacionais: InnoDB, NDB Cluster e Falcon. Diversas ferramentas de terceiros tambm esto disponveis; as ferramentas mais conhecidas atualmente so solidDB e PBXT. Ns discutimos algumas propriedades especficas de cada ferramenta na prxima seo. autoCoMMIt MySQL opera no modo AUTOCOMMIT por padro. Isso significa que a menos que voc explicitamente tenha comeado uma transao, ele automaticamente executa cada consulta em uma transao separada. Voc pode ativar ou desativar AUTOCOMMIT para a atual conexo configurando uma varivel:mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> SET AUTOCOMMIT = 1;

Os valores 1 e ON so equivalentes, como 0 e OFF. Quando voc executa com AUTOCOMMIT=0, voc sempre est em uma transao, at que execute um COMMIT ou ROLLBACK. MySQL ento inicia uma nova transao imediatamente. Alterar o valor de AUTOCOMMIT no tem efeito em tabelas no transacionais, como MyISAM ou Tabelas em Memria, que essencialmente sempre operam em modo AUTOCOMMIT. Certos comandos, quando executados durantes uma transao aberta, fazem com que MySQL conclua a transao antes de eles executarem. Eles so tipicamente comandos Data Definition Language (DDL Linguagem de Definio de Dados) que fazem alteraes significativas, como ALTER TABLE, mas LOCK TABLES e algumas outras expresses tambm possuem este efeito. Cheque a documentao da sua verso para a lista completa de comandos que automaticamente comitam uma transao. MySQL permite que voc configure o nvel de isolamento usando o comando SET TRANSACTION ISOLATION LEVEL, que surte efeito quando a prxima transao inicia. Voc pode configurar o nvel de isolamento para todo o servidor no arquivo de configurao (veja Captulo 6), ou somente para a sua sesso:mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

* A ferramenta de armazenamento PBXT inteligentemente evita alguns write-ahead logging. transaes | 9

MySQL reconhece todos os quatros nveis padres de isolamento ANSI, e InnoDB suporta todos eles. Outras ferramentas de armazenamento possuem diversificado suporte para diferentes nveis de isolamento.

Misturando ferramentas de armazenamento em transaesMySQL no gerencia transaes no nvel do servidor. Em vez disso, as fundamentais ferramentas de armazenamento implementam as transaes. Isso significa que voc no pode confiavelmente misturar ferramentas diferentes em uma nica transao. MySQL AB est trabalhando para adicionar um servio de gerenciamento de transao de alto nvel ao servidor, o que vai tornar seguro misturar e combinar tabelas transacionais em uma transao. At ento, tenha cuidado. Se voc misturar tabelas transacionais e no transacionais (por exemplo, tabelas InnoDB e MyISAM) em uma transao, a transao vai funcionar apropriadamente se tudo correr bem. Porm, se um rollback for solicitado, as alteraes na tabela no transacional no podem ser desfeitas. Isso deixa o banco de dados em um estado inconsistente do qual pode ser difcil de se recuperar e renderiza todo o ponto de transaes. por isso que muito importante pegar a ferramenta de armazenamento correta para cada tabela. MySQL geralmente no vai te prevenir ou levantar erros se voc fizer operaes transacionais em uma tabela no transacional. s vezes, desfazer uma transao vai gerar o aviso Algumas tabelas alteradas no transacionais no puderem ser desfeitas, mas, na maior parte do tempo, voc no ter indicao de que est trabalhando com tabelas no transacionais.

Bloqueio implcito e explcitoInnoDB usa um protocolo de bloqueio de duas fases. Ele pode obter bloqueios a qualquer momento durante uma transao, mas no os libera at um COMMIT ou ROLLBACK. Ele libera todos os bloqueios ao mesmo tempo. Os mecanismos de bloqueio descritos anteriormente so todos implcitos. InnoDB lida com bloqueios automaticamente, de acordo com seu nvel de isolamento. Porm, InnoDB tambm suporta bloqueio explcito, que o padro SQL no menciona absolutamente: SELECT ... LOCK IN SHARE MODE SELECT FOR UPDATE MySQL tambm suporta os comandos LOCK TABLES e UNLOCK TABLES, que so implementados no servidor, no nas ferramentas de armazenamento. Estes tm seus usos, mas no so um substituto para transaes. Se voc precisa de transaes, use uma ferramenta de armazenamento transacional. Geralmente, ns vemos aplicaes que foram convertidos de MyISAM para InnoDB, mas que ainda esto usado LOCK TABLES. Isso no mais necessrio por causa do bloqueio em nvel de linha e pode causar severos problemas de desempenho. A interao entre LOCK TABLES e transaes complexa, e h comportamentos inesperados em algumas verses de servidor. Ento, ns recomendamos que voc nunca use LOCK TABLES a menos que esteja em uma transao e AUTOCOMMIT esteja desativado, no importa qual ferramenta de armazenamento voc est usando.

Controle de Concorrncia de Verso MltiplaA maioria das ferramentas de armazenamento transacionais do MySQL, como InnoDB, Falcon e PBXT, no usa um simples mecanismo de bloqueio de linha. Em seu lugar, elas usam um bloqueio em nvel de linha em conjunto com uma tcnica para aumentar concorrncia conhecida como controle de concorrncia de verso mltipla (MVCC). MVCC no exclusivo ao MySQL: Oracle, PostgreSQL e alguns outros sistemas de banco de dados usam tambm.

10

| Captulo 1: arquitetura do MySQl

Voc pode classificar MVCC como em bloqueio em nvel de linha; ele evita a necessidade de bloquear em muitos casos e tem risco de problemas muito menor. Dependendo de como ele implementado, permite leituras no bloqueadas, enquanto bloqueia somente os registros necessrios durante operaes de escrita. MVCC funciona mantendo um snapshot dos dados como eles existiam em algum ponto no tempo. Isso significa que transaes podem enxergar uma visualizao consistente dos dados, no importa quanto tempo elas executem. Tambm significa que diferentes transaes podem ver dados diferentes nas mesmas tabelas ao mesmo tempo! Voc nunca tentou isso antes, pode ser confuso, mas vai se tornar mais fcil de entender conforme voc se familiariza. Cada ferramenta de armazenamento implementa MVCC de maneira diferente. Algumas das variaes incluem controle de concorrncia otimista e pessimista. Ns iremos ilustrar uma maneira que o MVCC trabalha explicando uma verso simplificada do comportamento do InnoDB. InnoDB implementa MVCC armazenando em cada linha dois valores adicionais, escondidos, que registram quando a linha foi criada e quando ela expirou (ou foi deletada). Em vez de armazenar os horrios reais que estes eventos ocorreram, a linha armazena o nmero da verso do sistema na hora em que o evento ocorreu. Este um nmero que incrementa toda vez que uma transao comea. Cada transao mantm seu prprio registro da verso do sistema atual, na data em que ele iniciou. Toda consulta tem de checar os nmeros de verso de cada linha em relao verso da transao. Vamos ver como isso se aplica a operaes particulares quando o nvel de isolamento da transao configurado em REPEATABLE READ: SELECT InnoDB deve examinar cada linha para garantir que ela se adapte a dois critrios: InnoDB deve encontrar uma verso da linha que no mnimo to velha quanto a transao (por exemplo, sua verso deve ser menor ou igual verso da transao). Isso garante que a linha existia antes da transao comear, ou que a transao criou ou alterou a linha. A verso de apagamento da linha deve ser indefinida ou maior do que a verso da transao. Isso garante que a linha no foi deletada antes da transao iniciar. Linhas que passam nos dois testes podem ser retornadas como o resultado da consulta. INSERT InnoDB registra o nmero da verso do sistema atual com a nova linha. DELETE InnoDB registra o nmero da verso do sistema atual como o ID de apagamento da linha. UPDATE InnoDB escreve uma nova cpia da linha, usando o nmero da verso do sistema para a verso da nova linha. Ele tambm escreve o nmero da verso do sistema com a verso de apagamento da velha linha. O resultado de manter todos estes registros extras que a maioria das consultas de leitura nunca adquire bloqueios. Elas simplesmente leem os dados o mais rpido que podem, garantindo a seleo de somente as linhas que atendem os critrios. As desvantagens so que a ferramenta de armazenamento tem de armazenar mais dados com cada linha, trabalhar mais ao examinar linhas e lidar com algumas adicionais operaes de manuteno. MVCC funciona somente com os nveis de isolamento REPEATABLE READ e READ COMMITTED. READ UNCOMMITTED no compatvel a MVCC porque consultas no leem a verso da linha que apropriada para a sua verso de transao; elas lem a verso mais nova, no importa qual seja. SERIALIZABLE no compatvel a MVCC porque leituras bloqueiam todas as linhas que elas retornam.Controle de Concorrncia de Verso Mltipla | 11

A Tabela 1-2 resume os vrios modelos de bloqueio e nveis de consistncia no MySQL. Tabela 1-2. Modelos de bloqueio de concorrncia no MySQL usando o nvel de isolamento padro.Estratgia de bloqueio Em nvel de tabela Em nvel de linha Em nvel de linha com MVCC Concorrncia Mais baixa Alta Mais alto Risco de problemas Mais baixo Alto Mais alto Ferramentas MyISAM, Merge, Memory NDB Cluster InnoDB, Falcon, PBXT, solidDB

Ferramentas de armazenamento do MySQlEsta seo d a voc uma viso geral das ferramentas de armazenamento do MySQL. No entraremos em muitos detalhes aqui, porque discutimos ferramentas de armazenamento e seus comportamentos particulares ao longo d livro. No entanto, at mesmo este livro no uma fonte completa de documentao; voc deve ler os manuais do MySQL para as ferramentas de armazenamento que voc decidir usar. MySQL tambm tem fruns dedicados para cada ferramenta de armazenamento, geralmente com links para informao adicional e maneiras interessantes de us-la. Se voc apenas quer comparar as ferramentas em um nvel alto, pode pular para a Tabela 1-3. MySQL armazena cada banco de dados (tambm chamado de esquema) como um subdiretrio do seu diretrio de dados no sistema de arquivo fundamental. Quando voc cria uma tabela, MySQL armazena a definio da tabela em um arquivo .frm com o mesmo nome da tabela. Assim, quando voc cria uma tabela chamada MyTable, MySQL armazena a definio da tabela em MyTable.frm. Por o MySQL usar o sistema de arquivo para armazenar nomes de banco de dados e definies de tabela, distino entre letras maisculas e minsculas depende da plataforma. Em uma instncia MySQL Windows, nomes de tabela e de banco de dados no possuem distino entre maisculas e minsculas; em sistemas como Unix, eles possuem a distino. Cada ferramenta de armazenamento armazena os dados da tabela e ndices de maneira diferente, mas o prprio servidor lida com a definio da tabela. Para determinar qual ferramenta de armazenamento uma tabela particular usa, use o comando SHOW TABLE STATUS. Por exemplo, para examinar a tabela user no banco de dados mysql, execute o seguinte:mysql> SHOW TABLE STATUS LIKE 'user' \G *************************** 1. row *************************** Name: user Engine: MyISAM Row_format: Dynamic Rows: 6 Avg_row_length: 59 Data_length: 356 Max_data_length: 4294967295 Index_length: 2048 Data_free: 0 Auto_increment: NULL Create_time: 2002-01-24 18:07:17 Update_time: 2002-01-24 21:56:29 Check_time: NULL Collation: utf8_bin Checksum: NULL Create_options: Comment: Users and global privileges 1 row in set (0.00 sec)

O resultado mostra que esta uma tabela MyISAM. Voc tambm pode perceber muitas outras informaes e estatsticas no resultado. Vamos rapidamente dar uma olhada no que cada linha significa:12 | Captulo 1: arquitetura do MySQl

Name O nome da tabela. Engine A ferramenta de armazenamento da tabela. Em verses antigas do MySQL, esta coluna era chamada Type, no Engine. Row_format O formato intocado. Para uma tabela MyISAM, isso pode ser Dinmico, Fixo ou Compactado. Linhas dinmicas variam em comprimento porque contm campos de comprimento varivel como VARCHAR ou BLOB. Linhas fixas, que so sempre do mesmo tamanho, so constitudas de campos que no variam em comprimento, como CHAR e INTEGER. Linhas compactadas existem somente em tabelas compactadas; veja Tabelas MyISAM compactadas, na pgina 15. Rows O nmero de linhas na tabela. Para tabelas no transacionais, este nmero sempre exato. Para tabelas transacionais , geralmente, uma estimativa. Avg_row_length Quantos bytes a linha comum contm. Data_length Quantos dados (em bytes) a tabela inteira contm. Max_data_length A quantidade mxima de dados que esta tabela pode conter. Veja Armazenamento, na pgina 14, para mais detalhes. Index_length Quanto espao de disco os dados de ndice consomem. Data_free Para uma tabela MyISAM, a quantidade de espao que alocado, mas atualmente inutilizado. Este espao contm as linhas previamente deletadas e podem ser exigidas por futuras expresses INSERT. Auto_increment O prximo valor AUTO_INCREMENT. Create_time Quando a tabela foi criada pela primeira vez. Update_time Quando os dados na tabela foram modificados pela ltima vez. Check_time Quando a tabela foi checada pela ltima vez usando CHECK TABLE ou myisamchk. Collation O conjunto de caractere padro e classificao para colunas de caractere nesta tabela. Veja Conjunto de Caractere e Classificao, na pgina 197, para mais sobre estas caractersticas.Ferramentas do armazenamento do MySQl | 13

Checksum Uma soma de verificao dos contedos de toda a tabela se ativado. Create_options Qualquer outra opo que foi especificada quando a tabela foi criada. Comment Este campo contm uma variedade de informaes extras. Para uma tabela MyISAM, contm os comentrios, se houver, que foram configurados quando a tabela foi criada. Se a tabela usar a ferramenta de armazenamento InnoDB, a quantidade de espao disponvel na tablespace InnoDB aparece aqui. Se a tabela for uma visualizao, o comentrio contm o texto VIEW.

a Ferramenta MyISaMComo ferramenta de armazenamento padro do MySQL, MyISAM oferece um bom acordo entre desempenho e caractersticas teis, como indexao de texto completo, compactao e funes espaciais (GIS). MyISAM no suporta transaes ou bloqueios em nvel de linha.

armazenamentoMyISAM tipicamente armazena cada tabela em dois arquivos: um arquivo de dados e um arquivo de ndice. Os dois arquivos sustentam extenses .MYD e .MYI, respectivamente. O formato MyISAM de plataforma neutra, significando que voc pode copiar os arquivos de dados e ndice a partir de um servidor baseado em Intel para um Powerpc ou Sun SPARC sem nenhum problema. Tabelas MyISAM podem conter linhas dinmicas ou estticas (comprimento fixo). MySQL decide qual formato usar baseado na definio da tabela. O nmero de linhas que uma tabela MyISAM pode conter limitado primariamente pelo espao em disco disponvel no seu servidor de banco de dados e o maior arquivo que seu sistema operacional vai permitir que voc crie. Tabelas MyISAM criadas no MySQL 5.0 com linhas de comprimento varivel so configuradas por padro para lidar com 256 TB de dados, usando ponteiros de 6 bytes aos registros de dados. Verses anteriores do MySQL padronizavam ponteiros de 4 bytes, para at 4 GB de dados. Todas as verses do MySQL podem lidar com um tamanho de ponteiro de at 8 bytes. Para modificar o tamanho do ponteiro em uma tabela MyISAM (seja para mais ou para menos), voc deve especificar os valores para as opes MAX_ROWS e AVG_ROW_LENGTH, que representam figuras aproximadas para a quantidade de espao que voc precisa:CREATE TABLE mytable ( a INTEGER NOT NULL PRIMARY KEY, b CHAR(18) NOT NULL ) MAX_ROWS = 1000000000 AVG_ROW_LENGTH = 32;

Neste exemplo, ns dissemos ao MySQL para ficar preparado para armazenar pelo menos 32 GB de dados na tabela. Para descobrir o que o MySQL decidiu fazer, simplesmente pea o status da tabela:mysql> SHOW TABLE STATUS LIKE 'mytable' \G *************************** 1. row *************************** Name: mytable Engine: MyISAM Row_format: Fixed Rows: 0 Avg_row_length: 0 Data_length: 0 Max_data_length: 98784247807 Index_length: 1024

14

| Captulo 1: arquitetura do MySQl

Data_free: 0 Auto_increment: NULL Create_time: 2002-02-24 17:36:57 Update_time: 2002-02-24 17:36:57 Check_time: NULL Create_options: max_rows=1000000000 avg_row_length=32 Comment: 1 row in set (0.05 sec)

Como voc pode ver, MySQL lembra das opes de criao exatamente como especificado e escolhe uma representao capaz de conter 91 GB de dados! Voc pode alterar o tamanho do ponteiro mais tarde com a expresso ALTER TABLE, mas isso vai fazer com que toda a tabela e todos os seus ndices sejam reescritos, o que pode levar muito tempo.

Caractersticas do MyISaMComo uma das mais velhas ferramentas de armazenamento includa no MySQL, MyISAM possui muitas caractersticas que foram desenvolvidas ao longo de muitos anos de uso para preencher necessidades do mercado: Bloqueio e concorrncia MyISAM bloqueia tabelas inteiras, no linhas. Leitores obtm bloqueios (de leitura) compartilhados em todas as tabelas que eles precisam ler. Escritores obtm bloqueios (de leitura) exclusivos. Porm, voc pode inserir novas linhas na tabela enquanto consultas selecionadas esto rodando nela (inseres concorrentes). Esta uma caracterstica muito importante e til. Reparao automtica MySQL suporta checagem e reparao automtica de tabelas MyISAM. Veja Ajuste de E/S do MyISAM, na pgina 234, para mais informaes. Reparao manual Voc pode usar os comandos CHECK TABLE mytable e REPAIR TABLE mytable para checar os erros de uma tabela e consert-los. Voc tambm pode usar a ferramenta de linha de comando myisamchk para checar e reparar tabelas quando o servidor estiver off-line. Caractersticas de ndice Voc pode criar ndices nos primeiros 500 caracteres das colunas BLOB e TEXT nas tabelas MyISAM. MyISAM suporta ndices de textos completos, o que indexa palavras individuais para operaes complexas de busca. Para mais informaes sobre indexao, veja o Captulo 3. Escritas de chave atrasadas Tabelas MyISAM marcadas com a opo de criao DELAY_KEY_WRITE no escrevem dados de ndice alterados no disco no final de uma consulta. Em vez disso, MyISAM faz buffer das alteraes no buffer chave na memria. Ele envia blocos de ndice ao disco quando ele corta o buffer ou fecha a tabela. Isso pode melhorar o desempenho em tabelas pesadamente usadas que mudam frequentemente. Porm, depois de um servidor ou sistema travar, os ndices estaro definitivamente corrompidos e precisaro de reparo. Voc deve cuidar disso com um script que execute myisamchk antes de reiniciar o servidor, ou usando as opes de recuperao automtica mesmo se voc no usar DELAY_KEY_WRITE, estes salva-vidas ainda podem ser uma excelente ideia). Voc pode configurar escritas de chave atrasadas globalmente, assim como para tabelas individuais.

tabelas MyISaM compactadasAlgumas tabelas por exemplo, em aplicaes baseadas em CD-ROM ou DVD-ROM e alguns ambientes embutidos nunca mudam depois de serem criadas e preenchidas com os dados. Estas podem ser bem adaptadas a tabelas MyISAM compactadas.Ferramentas do armazenamento do MySQl | 15

Voc pode compactar (ou empacotar) tabelas com a utilidade myisampack. Voc no pode modificar tabelas compactadas (embora voc possa descompactar, modificar e recompactar tabelas se precisar), mas elas geralmente usam menos espao em disco. Como resultado, elas oferecem desempenho mais rpido, porque seu tamanho menor exige buscas ao disco para encontrar registros. Tabelas MyISAM compactadas podem ter ndices, mas eles so somente leitura. O problema de descompactar dados para l-lo insignificante para a maioria das aplicaes em hardwares modernos, em que o ganho real est em reduzir a E/S. As linhas so compactadas individualmente, ento MySQL no precisa descompactar uma tabela inteira (ou at mesmo uma pgina) apenas para trazer uma nica linha.

a Ferramenta Merge MyISaMA ferramenta Merge uma variao do MyISAM. Uma tabela Merge a combinao de diversas tabelas MyISAM idnticas em uma tabela virtual. Isso particularmente til quando voc usa MySQL em aplicaes de log e depsito de dados. Veja Tabelas Merge e Particionamento, na pgina 211, para uma discusso detalhada sobre tabelas Merge.

a Ferramenta InnoDBInnoDB foi desenvolvido para processamento de transao especialmente, processamento de muita transaes de vida curta que geralmente completam ao invs de serem desfeitas. Ele continua a ferramenta de armazenamento mais popular para armazenamento transacional. Seu desempenho e recuperao de travamento automtica tambm o tornam popular para necessidades de armazenamento no-transacional. InnoDB armazena seus dados em uma srie de um ou mais arquivos de dados que so coletivamente conhecidos como uma tablespace. Uma tablespace essencialmente uma caixa preta que InnoDB gerencia sozinho. No MySQL 4.1 e em verses mais novas, InnoDB pode armazenar os ndices e dados de cada tabela em arquivos separados. InnoDB tambm pode usar parties de discos intocados para construir sua tablespace. Veja O tablespace InnoDB, na pgina 241, para mais informaes. InnoDB usa MVCC para atingir alta concorrncia e implementa todos os quatros nveis de isolamento padro do SQL. Ele padroniza no nvel de isolamento REPEATABLE READ e possui uma estratgia next-key locking (bloqueio da prxima linha) que previne leituras fantasmas neste nvel de isolamento: em vez de bloquear somente as linhas que voc tocou em uma consulta, InnoDB bloqueia lacunas na estrutura de ndice tambm, evitando que fantasmas sejam reiniciados. Tabelas InnoDB so construdas em um ndice agrupado, que iremos abordar em detalhes no Captulo 3. As estruturas de ndice do InnoDB so muito diferentes das estruturas da maioria das outras ferramentas de armazenamento do MySQL. Como um resultado, ele oferece buscas de chave primria muito rpidas. Porm, ndices secundrios (ndices que no so a chave primria) contm as colunas da chave primria, ento se sua chave primria for grande, outros ndices tambm sero grandes. Voc deve tentar uma pequena chave primria se voc tiver muitos ndices em uma tabela. InnoDB no compacta seus ndices. Na poca desta escrita, InnoDB no pode construir ndices por classificao, o que MyISAM pode fazer. Assim, InnoDB carrega dados e cria ndices mais lentamente do que MyISAM. Qualquer operao que modifica a estrutura da tabela InnoDB vai reconstruir a tabela inteira, incluindo todos os ndices. InnoDB foi desenvolvido quando a maioria dos servidores tinha discos lentos, uma nica CPU, e memria limitada. Hoje, como servidores de mltiplas centrais com grandes quantidades de memria e discos rpidos esto se tornando menos caros, InnoDB est experimentando alguns problemas de escalonamento. Desenvolvedores InnoDB esto resolvendo esses assuntos, mas na poca desta escrita, diversos deles continuavam problemticos. Veja Ajuste de Concorrncia do InnoDB, na pgina 246, para mais informaes sobre como alcanar alta concorrncia com InnoDB.16 | Captulo 1: arquitetura do MySQl

Alm das suas capacidades de alta concorrncia, a prxima caracterstica mais popular do InnoDB a restrio de chave estrangeira, que o prprio servidor MySQL ainda no oferece. InnoDB tambm oferece buscas extremamente rpidas para consultas que usam uma chave primria. InnoDB tem uma variedade de otimizaes internas. Estas incluem previso de leitura para trazer dados antecipadamente a partir do disco, um ndice de hash adaptvel que automaticamente constri ndices de hash na memria para buscas muito rpidas, e um buffer de insero para acelerar inseres. Ns abordamos estas extensivamente mais tarde neste livro. O comportamento do InnoDB muito confuso, e ns altamente recomendamos ler a seo Modelo de Transao InnoDB e bloqueio do manual MySQL se voc estiver usando InnoDB. H muitas surpresas e excees que voc deve estar ciente antes de construir uma aplicao com InnoDB.

a Ferramenta MemoryTabelas Memory (anteriormente chamadas de tabelas HEAP) so teis quando voc precisa de rpido acesso aos dados que nunca mudam ou que no precisam persistir depois de uma reinicializao. Tabelas Memory so, geralmente, em ordem de magnitude mais rpidas do que tabelas MyISAM. Todos os seus dados so armazenados na memria, ento consultas no tm de esperar por E/S de disco. A estrutura da tabela de uma tabela Memory persiste aps a reinicializao de um servidor, mas nenhum dado sobrevive. Aqui esto alguns bons usos para tabelas Memory: Para buscar ou mapear tabelas, como uma tabela que mapeia cdigos postais para nomes de estados Para fazer cache de resultados dos dados periodicamente agregados Para resultados intermedirios ao analisar dados Tabelas Memory suportam ndices HASH, que so muito rpidos para buscar consultas. Veja ndices hash, na pgina 84, para mais informaes sobre ndices HASH. Apesar das tabelas Memory serem muito rpidas, elas geralmente no funcionam bem como um substituto de objetivo geral para tabelas baseadas em disco. Elas usam bloqueio em nvel de tabela, o que d uma concorrncia de escrita muito baixa, e elas no suportam os tipos de coluna TEXT ou BLOB. Elas tambm suportam somente linhas de tamanho fixo, ento elas realmente armazenam VARCHARs como CHARs, o que pode desperdiar memria. MySQL usa a ferramenta Memory internamente enquanto processa consultas que exigem uma tabela temporria para manter resultados imediatos. Se o resultado intermedirio tornar-se muito grande para uma tabela Memory, ou tiver as colunas TEXT ou BLOB, MySQL vai convert-lo em uma tabela MyISAM no disco. Falaremos mais sobre isso em captulos futuros. As pessoas geralmente confundem tabelas Memory com tabelas temporrias, que so tabelas efmeras criadas com CREATE TEMPORARY TABLE. Tabelas temporrias podem usar qualquer ferramenta de armazenamento; elas no so a mesma coisa que tabelas que usam a ferramenta de armazenamento Memory. Tabelas temporrias so visveis somente nica conexo e desaparecem completamente quando a conexo fecha.

a Ferramenta archiveA ferramenta Archive suporta somente consultas INSERT e SELECT, e no suporta ndices. Ela causa muito menos E/S de disco do que MyISAM, porque faz buffer de escritas de dados e compacta cada linha com zlib conforme ela inserida. Tambm, cada consulta SELECT exige um scan de tabela completo. Tabelas Archive so, dessa maneira, ideais para aquisio de log e de dados, em que a anlise tende a escanear uma tabela inteira, ou onde voc quer consultas INSERT rpidas em um mestre de replicao. Escravos de replicao usam umaFerramentas do armazenamento do MySQl | 17

ferramenta de armazenamento diferente para a mesma tabela, o que significa que a tabela no escravo possui ndices para desempenho mais rpido na anlise veja o Captulo 8 para mais sobre replicao). Archive suporta bloqueio em nvel de linha e um sistema especial de buffer para inseres de alta concorrncia. Ele d leituras consistentes parando um SELECT depois de ter recuperado o nmero de linhas que existiam na tabela quando a consulta comeou. Ele tambm faz vrias inseres invisveis at que elas estejam completas. Estas caractersticas emulam alguns aspectos de comportamentos transacionais e de MVCC, mas Archive no uma ferramenta de armazenamento transacional. , simplesmente, uma ferramenta de armazenamento que otimizada para insero em alta velocidade e armazenamento compactado.

a Ferramenta CSVA ferramenta CSV pode tratar arquivos de valores separados por vrgulas (CSV) como tabelas, mas no suporta ndices neles. Esta ferramenta permite que voc copie arquivos dentro e fora do banco de dados enquanto o servidor est rodando. Se voc exportar um arquivo CSV de uma planilha eletrnica e salvlo no diretrio de dados do servidor MySQL, o servidor pode l-lo imediatamente. Similarmente, se voc escrever dados em uma tabela CSV, um programa externo pode l-los imediatamente. Tabelas CSV so especialmente teis como um formato de troca de dados e para certos tipos de log.

a Ferramenta FederatedA ferramenta Federated no armazena dados localmente. Cada tabela Federated refere-se a uma tabela em um servidor MySQL remoto, ento realmente ela se conecta a um servidor remoto para todas as operaes. s vezes usada para ativar hacks, assim como truques com replicao. H muitas esquisitices e limitaes na atual implementao desta ferramenta. Por causa da maneira como a ferramenta Federated funciona, ns achamos que ela mais til para buscas de linha nica por chave primria, ou para consultas INSERT que voc quer para afetar um servidor remoto. Ela no executa bem em consultas agregadas, joins ou outras operaes bsicas.

a Ferramenta BlackholeA ferramenta no possui nenhum mecanismo de armazenamento. Ela descarta todo INSERT ao invs de armazen-lo. Porm, o servidor escreve consultas nas tabelas Blackhole para seu log habitual, para que elas possam ser replicadas aos escravos ou, simplesmente, mantidas no log. Isso torna a ferramenta Blackhole til para configuraes de replicao sofisticadas e auditar log.

a Ferramenta NDB ClusterMySQL AB adquiriu a ferramenta NDB Cluster da Sony Ericsson em 2003. Foi originalmente desenvolvida para alta velocidade (requisitos de desempenho em tempo real), com redundncia e capacidade de equilbrio de carga. Embora tenha sido logada no disco, ela manteve todos os seus dados na memria e foi otimizada para buscas de chave primria. Desde ento MySQL adicionou outros mtodos de indexao e muitas otimizaes, e MySQL 5.1 permite que algumas colunas sejam armazenadas no disco. A arquitetura NDB nica: um NDB Cluster completamente diferente, por exemplo, de um cluster Oracle. A infraestrutura do NDB baseada em um conceito de nenhum compartilhamento. No h uma rede de rea de armazenamento ou outra grande soluo de armazenamento centralizada, nos quais outros tipos de clusters baseiam-se. Um banco de dados NDB consiste em ns de dados, ns de gerenciamento e ns SQL (instncias MySQL). Cada n de dado contm um segmento (fragmento) dos dados do cluster. Os fragmentos so duplicados, ento o sistema tem mltiplas cpias dos mesmos dados em diferentes ns. Um servidor fsico , geralmente, dedicado a cada n por redundncia e alta disponibilidade. Neste sentido, NDB similar a RAID no nvel do servidor.18 | Captulo 1: arquitetura do MySQl

Os ns de gerenciamento so usados para recuperar a configurao centralizada e para monitorar e controlar os ns de cluster. Todos os ns de dados comunicam-se uns com os outros, e todos os servidores MySQL conectam-se a todos os ns de dados. Baixa latncia de rede crucialmente importante para NDB Cluster. Um aviso: NDB Cluster uma tecnologia muito legal e definitivamente vale a pena alguma explorao para satisfazer sua curiosidade, mas muitas pessoas tcnicas tendem a procurar desculpas para us-la e tentam aplic-la para necessidades as quais no favorvel. Na nossa experincia, mesmo depois de estud-la cuidadosamente, muitas pessoas ainda no aprendem para que serve esta ferramenta e como ela funciona at instalarem e usarem por um tempo. Isso comumente resulta em muito desperdcio de tempo, porque simplesmente no desenvolvido como uma ferramenta de armazenamento de objetivo geral. Um choque comum que NDB atualmente realiza joins no nvel do servidor MySQL, no na camada da ferramenta de armazenamento. Porque todos os dados para NDB devem ser recuperados atravs da rede, joins complexas so extremamente lentas. Por outro lado, buscas de tabela nica podem ser muito rpidas, porque mltiplos ns de dados oferecem parte do resultado. Este apenas um dos muitos aspectos que voc ter de considerar e entender totalmente ao procurar no NDB Cluster para uma aplicao em particular. NDB Cluster to grande e complexo que no discutiremos com detalhes neste livro. Voc deve procurar um livro dedicado a este tpico se voc tiver interesse. Porm, diremos que, geralmente, ele no o que voc pensa que , e para a maioria das aplicaes tradicionais, ele no a resposta.

a Ferramenta FalconJim Starkey, um pioneiro em banco de dados cujas mais recentes invenes incluem Interbase, MVCC e o tipo de coluna BLOB, desenvolveu a ferramenta Falcon. MySQL AB adquiriu a tecnologia Falcon em 2006, e Jim atualmente trabalha para MySQL AB. Falcon desenvolvido para hardwares atuais especificamente, para servidores com mltiplos processadores de 64 bits e muita memria mas tambm pode operar em ambientes mais modestos. Falcon usa MVCC e tenta manter as transaes executando inteiramente na memria. Isso faz rollbacks e operaes de recuperao extremamente rpidas. Falcon est finalizado na poca desta escrita (por exemplo, ele ainda no sincroniza seus commits com o log binrio), ento no podemos escrever sobre ele com muita autoridade. At avaliaes iniciais de desempenho que fizemos com ele provavelmente estaro desatualizadas quando estiver pronto para uso geral. Ele parece ter um bom potencial para muitas aplicaes on-line, mas saberemos mais sobre ele conforme o tempo for passando.

a Ferramenta solidDBA ferramenta solidDB, desenvolvida por Solid Information Technology (http://www.soliddb.com), uma ferramenta transacional que usa MVCC. Ela suporta controle de concorrncia pessimista e otimista, o que nenhuma outra ferramenta atualmente faz. solidDB para MySQL inclui suporte completo de chave estrangeira. similar ao InnoDB em muitas maneiras, como seu uso de ndices agrupados. solidDB para MySQL inclui uma capacidade de backup on-line sem nenhum custo. O solidDB para produto MySQL um pacote completo que consiste na ferramenta de armazenamento solidDB, a ferramenta de armazenamento MyISAM e o servidor MySQL. A cola entre a ferramenta de armazenamento solidDB e o servidor MySQL foi introduzida em 2006. Porm, a tecnologia fundamental e cdigo amadureceram durantes os 15 anos de histria da empresa. solid certifica e suporta o produto todo. licenciado sob GPL e oferecido comercialmente sob um modelo de licenciamento duplo que idntico ao do servidor MySQL.

Ferramentas do armazenamento do MySQl |

19

a Ferramenta pBXt (primebase Xt)A ferramenta PBXT, desenvolvida por Paul McCullagh da SNAP Innovation GmbH em Hamburgo, Alemanha (http://www.primebase.com), uma ferramenta de armazenamento transacional com um design nico. Uma das suas caractersticas diferenciadas como ela usa seus logs transacionais e arquivos de dados para evitar log write-ahead, o que reduz muitos problemas da execuo da transao. Esta arquitetura d ao PBXT o potencial para lidar com concorrncia de escrita muito alta, e testes j mostraram que ele pode ser mais rpido do InnoDB para certas operaes. PBXT usa MVCC e suporta restries de chave estrangeira, mas no usa ndices agrupados. PBXT uma ferramenta muito nova, e vai precisar se provar superior em ambientes de produo. Por exemplo, sua implementao de transaes verdadeiramente durveis s foi completada recentemente, enquanto escrevamos este livro. Como uma extenso a PBXT, SNAP Innovation est trabalhando em uma estrutura blob streaming escalonvel (http://www.blobstreaming.org). desenvolvida para armazenar e recuperar grandes quantidades de dados binrios de maneira eficiente.

a Ferramenta de armazenamento MariaMaria uma nova ferramenta de armazenamento sendo desenvolvida por alguns engenheiros superiores do MySQL incluindo Michael Widenius, que criou MySQL. O release inicial 1.0 inclui somente algumas das suas caractersticas planejadas. O objetivo usar Maria como um substituto para MyISAM, que atualmente a ferramenta de armazenamento padro do MySQL, e a qual o servidor usa internamente para tarefas como tabelas de privilgios e tabelas temporrias criadas ao executar consultas. Aqui esto alguns destaques: A opo de armazenamento transacional ou no-transacional, em uma base por tabela Recuperao de travamento, mesmo quando a tabela estiver executando em modo no-transacional Bloqueio em nvel de linha e MVCC Melhor gerenciamento de BLOB

outras Ferramentas de armazenamentoVrios terceiros oferecem outras (s vezes do proprietrio) ferramentas, e h uma variedade de ferramentas experimentais e de objetivo geral por a (por exemplo, uma ferramenta para consultar servios web). Algumas destas ferramentas so desenvolvidas informalmente, talvez por apenas um ou dois engenheiros. Isso porque relativamente fcil criar uma ferramenta de armazenamento para MySQL. Porm, a maioria destas ferramentas no amplamente publicada, em parte por causa da sua aplicabilidade limitada. Deixaremos que voc explore estas ofertas por sua conta.

Selecionando a Ferramenta CorretaAo desenvolver aplicaes baseadas no MySQL, voc deve decidir qual ferramenta de armazenamento usar para armazenar seus dados. Se voc no pensar nisso durante a fase de desenvolvimento, voc provavelmente vai se deparar com complicaes mais tarde no processo. Voc pode achar que a ferramenta padro no oferece uma caracterstica que voc precisa, como transaes, ou, talvez, a mistura de consultas de escrita e leitura que a sua aplicao gera vo exigir bloqueio mais granular do que os bloqueios de tabela do MyISAM. Por voc poder escolher ferramentas de armazenamento em uma base de tabela-por-tabela, voc precisar de uma ideia clara de como cada tabela ser usada e os dados que ela vai armazenar. Tambm ajuda ter um bom entendimento da aplicao por completo e seu potencial para crescimento. Munidos com estas informaes, voc pode comear a fazer boas escolhas sobre quais ferramentas de armazenamento podem fazer o trabalho.20 | Captulo 1: arquitetura do MySQl

No necessariamente uma boa ideia usar diferentes ferramentas de armazenamento para tabelas diferentes. Se voc puder se virar com ele, geralmente vai tornar sua vida muito mais fcil se voc escolher uma ferramenta de armazenamento para todas as suas tabelas.

ConsideraesEmbora muitos fatores possam afetar sua deciso sobre qual ferramenta(s) de armazenamento usar, normalmente chegamos a algumas consideraes primrias. Aqui esto os elementos principais que voc deve levar em considerao: Transaes Se sua aplicao exigir transaes, InnoDB a escolha mais comprovada, estvel e bem integrada na poca desta escrita. Porm, esperamos ver as ferramentas transacionais como fortes candidatos com o passar do tempo. MyISAM uma boa escolha se uma tarefa no exigir transaes e realizar primariamente consultas SELECT ou INSERT. s vezes, componentes especficos de uma aplicao (como log) caem nesta categoria. Concorrncia Como melhor satisfazer seus requisitos de concorrncia depende da sua carga de trabalho. Se voc somente precisar inserir e ler concorrentemente, acredite ou no, MyISAM uma boa escolha! Se voc precisar permitir que uma mistura de operaes rode concorrentemente sem interferir umas com as outras, uma das ferramentas com bloqueio em nvel de linha deve funcionar bem. Backups A necessidade de realizar backups regulares tambm pode influenciar suas escolhas de tabela. Se seu servidor puder ser encerrado em intervalos regulares para backups, as ferramentas de armazenamento so igualmente fceis de lidar. Porm, se voc precisar executar backups on-line de uma forma ou de outra, as escolhas se tornam menos claras. O Captulo 11 trata deste tpico com mais detalhes. Tambm tenha em mente que usar mltiplas ferramentas de armazenamento aumenta a complexidade de backups e ajuste de servidor. Recuperao de travamento Se voc tiver muitos dados, deve seriamente considerar quanto tempo ele vai levar para recuperar-se de um travamento. Tabelas MyISAM geralmente se corrompem mais facilmente e demoram mais para recuperar-se do que tabelas InnoDB, por exemplo. De fato, esta uma das razes mais importantes porque as pessoas usam InnoDB quando no precisam de transaes. Caractersticas especiais Finalmente, s vezes, voc pode perceber que uma aplicao baseia-se em caractersticas particulares ou otimizaes que somente algumas das ferramentas de armazenamento do MySQL oferecem. Por exemplo, muitas aplicaes se baseiam em otimizaes de ndice agrupado. Neste momento, isso limita voc a InnoDB e solidDB. Por outro lado, somente MyISAM suporta busca de texto completo dentro do MySQL. Se uma ferramenta de armazenamento adequar-se a um ou mais dos requisitos importantes, mas no a outros, voc precisa chegar a um termo comum ou encontrar uma inteligente soluo de design. Voc pode freqentemente obter o que precisa de uma ferramenta de armazenamento que aparentemente no suporta seus requisitos.

Ferramentas do armazenamento do MySQl |

21

Voc no precisa decidir imediatamente. H muito material sobre os pontos fortes e fracos de cada ferramenta de armazenamento no resto do livro e, tambm, muitas dicas de arquitetura e design. Em geral, h, provavelmente, mais opes do que voc imagina, e pode ajudar a voltar a esta questo depois de ler mais.

Exemplos prticosEstes assuntos podem parecer muito abstratos sem algum tipo de contexto do mundo real, ento vamos considerar algumas comuns aplicaes de banco de dados. Vamos examinar uma variedade de tabelas e determinar qual ferramenta melhor se adapta s necessidades de cada tabela. Damos um resumo das opes na prxima seo.

logSuponha que voc queira usar MySQL para logar um registro de cada ligao telefnica de um interruptor de telefone central em tempo real. Ou talvez voc instalou mod_log_sql para Apache, ento voc pode logar todas as visitas ao seu site diretamente em uma tabela. Em tal aplicao, velocidade , provavelmente, o objetivo mais importante; voc no quer o banco de dados seja um obstculo. As ferramentas de armazenamento MyISAM e Archive funcionam muito bem porque possuem baixssimo risco de problemas e podem inserir milhares de registros por segundo. A ferramenta de armazenamento PBXT provvel que tambm seja particularmente adequada para objetivos de log. Porm, as coisas vo ficar interessantes se voc decidir que hora de comear a executar relatrios para resumir os dados que voc logou. Dependendo das consultas que voc usa, h uma boa chance de que reunir dados para o relatrio diminua significativamente o processo de insero de registros. O que voc pode fazer? Uma soluo usar a caracterstica de replicao embutida do MySQL para clonar os dados em um segundo (escravo) servidor e, ento, executar suas consultas consumidoras de tempo e CPU sobre os dados no escravo. Isso deixa o mestre livre para inserir registros e permite que voc execute qualquer consulta que quiser no escravo sem se preocupar como ela pode afetar o log de tempo real. Voc tambm pode executar consultas em momentos de baixa carga, mas confie que esta estratgia vai continuar a funcionar conforme sua aplicao cresce. Outra opo usar uma tabela Merge. Ao invs de sempre logar na mesma tabela, ajusta a aplicao para logar a uma tabela que contenha o ano e nome ou nmero do ms no seu nome, como web_logs_2008_01 ou web_logs_2008_jan. Ento, defina uma tabela Merge que contenha os dados que voc quer resumir e use-a nas suas consultas. Se voc precisa resumir dados diariamente ou semanalmente, a mesma estratgia funciona; voc somente precisa criar tabelas com nomes mais especficos, como web_logs_2008_01_01. Enquanto voc estiver ocupado executando consultas nas tabelas que no esto mais sendo escritas, sua aplicao pode logar registros sua atual tabela ininterrupta.

tabelas somente leitura ou principalmente leituraTabelas que contm dados usados para construir um catlogo ou algum tipo de listagem (trabalhos, leiles, bens imobilirios etc.) so, geralmente, mais lidas do que escritas. Isso faz delas boas candidatas para MyISAM se voc no se importa com o que acontece quando MyISAM trava. No subestime a importncia disso; muitos usurios realmente no entendem como arriscado usar uma ferramenta de armazenamento que nem ao menos se esfora para ter seus dados escritos no disco. uma excelente ideia executar uma realista simulao de carga em um servidor de teste e, ento, literalmente retirar o plug de energia. A experincia de recuperar-se de um travamento impagvel. Poupa surpresas chatas no futuro.

22

| Captulo 1: arquitetura do MySQl

No acredite somente na comum sabedoria popular: MyISAM mais rpido do que InnoDB. No categoricamente verdade. Ns podemos nomear dezenas de situaes em que InnoDB deixa o MyISAM na poeira, especialmente para aplicaes em que ndices agrupados so teis ou onde os dados cabem na memria. Conforme l o restante deste livro, voc ter uma compreenso de quais fatores influenciam o desempenho de uma ferramenta de armazenamento (tamanho dos dados, nmero de operaes de E/S exigidas, chave primria versus ndices secundrios etc.) e quais delas tm importncia para sua aplicao.

processamento de pedidoQuando voc lida com qualquer tipo de processamento de pedido, transaes so tudo, menos exigidas. Pedidos pela metade no vo fazer os clientes gostarem do seu servio. Outra considerao importante se a ferramenta precisa suportar restries de chave estrangeira. provvel que InnoDB seja sua melhor aposta para aplicaes de processamento de pedido, apesar de que qualquer ferramenta de armazenamento transacional seja boa candidata.

preos de aes ou ttulosSe voc estiver coletando preos de aes ou ttulos para sua prpria anlise, MyISAM funciona muito bem, com as interrupes normais. Porm, se voc estiver executando um servio web de alto trfego que tem uma alimentao de cotaes em tempo real e milhares de usurios, uma consulta nunca deve ter de esperar. Muitos clientes podem estar tentando ler e escrever na tabela simultaneamente, ento um bloqueio em nvel de linha ou um design que minimiza atualizaes o caminho certo.

Quadro de avisos e fruns de discusso concorrentesDiscusses concorrentes so um problema interessante para usurios MySQL. H centenas de sistemas baseados em Perl e PHP gratuitamente disponveis que oferecem discusses concorrentes. Muitos deles no so escritos com eficincia de banco de dados em mente, ento eles tendem a executar muitas consultas para cada requisio que eles servem. Alguns foram escritos para serem independentes do banco de dados, ento suas consultas no tiram vantagem das caractersticas de nenhum sistema de banco de dados. Eles tambm tendem a atualizar contadores e compilar estatsticas de uso sobre as vrias discusses. Muitos dos sistemas tambm usam algumas tabelas monolticas para armazenar todos os seus dados. Como um resultado, algumas tabelas centrais tornam-se o foco de pesada atividade de leitura e de escrita, e os bloqueios exigidos para forar consistncia tornam-se uma substancial fonte de conteno. Apesar dos seus defeitos de design, a maioria dos sistemas funciona bem para cargas pequenas e mdias. Porm, se um site crescer bastante e gerar trfego significativo, ele pode se tornar muito lento. A soluo bvia trocar para uma diferente ferramenta de armazenamento que possa lidar com pesado volume de leitura/escrita, mas usurios que tentam isso s vezes so surpreendidos ao descobrir que os sistemas executam ainda mais vagarosamente do que antes! O que estes usurios no percebem que o sistema est usando uma consulta particular, normalmente algo assim:mysql> SELECT COUNT(*) FROM table;

O problema que nem todas as ferramentas podem executar esta consulta rapidamente: MyISAM pode, mas outras ferramentas no. H exemplos similares para toda ferramenta. O Captulo 2 vai te ajudar a evitar que esta situao te pegue de surpresa e vai mostrar a voc como encontrar e consertar os problemas.

aplicaes em CD-RoMSe um dia voc precisar distribuir uma aplicao baseada em CD-ROM ou DVD-ROM que usa arquivos de dados MySQL, considere usar MyISAM ou tabelas MyISAM compactadas, que podem facilmente ser isoladas e copiadas em outra mdia. Tabelas MyISAM compactadas usam muito menos espao do que as descomFerramentas do armazenamento do MySQl | 23

pactadas, mas so somente leitura. Isso pode ser problemtico em certas aplicaes, mas como os dados vo ser mdias de somente leitura, h pouca razo em no usar tabelas compactadas para esta tarefa particular.

Resumo de Ferramenta de armazenamentoA Tabela 1-3 resume as caractersticas relacionadas transao e bloqueio das ferramentas de armazenamento mais populares do MySQL. A coluna da verso do MySQL mostra a verso mnima do MySQL que voc vai precisar para usar a ferramenta, embora para algumas ferramentas e verses de MySQL voc pode ter de compilar seu prprio servidor. A palavra Todas nesta coluna indica todas as verses desde MySQL 3.23. Tabela 1-3. Resumo de ferramenta de armazenamento do MySQL.Ferramenta de Verso MySQl transaes armazenamento MyISAM Todas No MyISAM Merger Todas No Granularidade de bloqueio Tabela com inseres concorrentes Tabela com inseres concorrentes Tabela aplicaes chave Indicaes do contador SELECT, INSERT, Carga de trabalho carga em massa leitura/escrita mista Arquivamento seg- Muitas buscas globais mentado, depsito de dados Clculos intermeGrandes datasets, armazenamento persistente dirios, dados de busca estatsticos Processamento Nenhuma transacional Processamento Nenhuma transacional Log, anlise Necessidades de agregada acesso, atualizaes e apagamentos aleatrios Log, carga em Necessidades de acesmassa de dados so aleatrio, indexao externos Arquivamento loga- Tudo menos o uso do ou replicado intencionado Fontes de dados Tudo menos o uso distribudas intencionado Alta disponibilidade Usos mais tpicos Processamento Necessidade ndices transacional, log agrupados Processamento Nenhuma transacional Substituio de Nenhuma MyISAM

Memory (HEAP)

Todas

No

InnoDB Falcon Archive

Todas 6.0 4.1

Sim Sim Sim

Nvel de linha com MVCC Nvel de linha com MVCC Nvel de linha com MVCC Tabela

CSV

4.1

No

Blackhole Federated NDB Cluster PBXT solidDB Maria (planejado)

4.1 5.0 5.0 5.0 5.0 6.x

Sim No disponvel Sim Sim Sim Sim

Nvel de linha com MVCC N/D Nvel de linha Nvel de linha com MVCC Nvel de linha com MVCC Nvel de linha com MVCC

Converses de tabelaH diversas maneiras de converter uma tabela de uma ferramenta de armazenamento para outra, cada uma com vantagens e desvantagens. Nas sees seguintes, ns abordamos trs das formas mais comuns.

altER taBlEA maneira mais fcil de mover uma tabela de uma ferramenta para outra com a expresso ALTER TABLE. O seguinte comando converte mytable para Falcon:24 | Captulo 1: arquitetura do MySQl

mysql> ALTER TABLE mytable ENGINE = Falcon;

Esta sintaxe funciona para todas as ferramentas de armazenamento, mas h uma desvantagem: pode levar muito tempo. MySQL vai executar uma cpia linha por linha da sua tabela antiga na sua tabela nova. Durante este tempo, voc provavelmente estar usando toda a capacidade de E/S de disco do servidor, e a tabela original ser bloqueada para leitura enquanto a converso acontece. Ento, tenha cuidado antes de tentar esta tcnica em uma tabela ocupada. Ao invs disso, voc pode usar um dos mtodos discutidos a seguir, que envolvem fazer uma cpia da tabela primeiro. Quando voc converte uma ferramenta de armazenamento para outro, qualquer caracterstica especfica ferramenta de armazenamento perdida. Por exemplo, se voc converter uma tabela InnoDB para MyISAM e voltar novamente, voc perder qualquer chave estrangeira originalmente definida na tabela InnoDB.

Esvaziar e importarPara ganhar mais controle sobre o processo de converso, voc pode escolher primeiro esvaziar a tabela a um arquivo de texto usando a utilidade mysqldump. Depois de voc ter esvaziado a tabela, voc pode, simplesmente, editar o arquivo vazio para ajustar a expresso CREATE TABLE que ele contm. Tenha certeza de modificar o nome da tabela, assim como seu tipo, porque voc no pode ter duas tabelas com o mesmo nome no mesmo banco de dados, mesmo se elas forem de tipos diferentes e mysqldump padroniza em escrever o comando DROP TABLE antes de CREATE TABLE, ento voc pode perder seus dados se no for cuidadoso! Veja Captulo 11 para mais conselhos sobre como apagar e recarregar dados eficientemente.

CREatE e SElECtA terceira tcnica de converso um termo comum entre a velocidade do primeiro mecanismo e a segurana do segundo. Ao invs de apagar a tabela inteira ou convert-la toda de uma vez, crie a nova tabela e usa a sintaxe INSERT ... SELECT do MySQL para popul-la, como segue:mysql> CREATE TABLE innodb_table LIKE myisam_table; mysql> ALTER TABLE innodb_table ENGINE=InnoDB; mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Isso funciona bem se voc no tiver muitos dados, mas se voc tiver, geralmente mais eficiente popular a tabela progressivamente, comitando a transao entre cada bloco para que os logs de cancelamento no cresam muito. Supondo que id a chave primria, execute esta consulta repetidamente (usando valores maiores de x e y cada vez) at que voc tenha copiado todos os dados na tabela nova:mysql> mysql> -> mysql> START TRANSACTION; INSERT INTO innodb_table SELECT * FROM myisam_table WHERE id BETWEEN x AND y; COMMIT;

Depois de fazer isso, ser deixada a voc a tabela original, que voc pode limpar quando tiver terminado o trabalho com ela, e a tabela nova, que no est totalmente populada. Tenha o cuidado de bloquear a tabela original, se necessrio, para evitar obter uma cpia inconsistente dos dados!

Ferramentas do armazenamento do MySQl |

25