XOOPS Brasil

 

1.6. MySQL e o Futuro (o TODO)

Esta seção lista os recursos que planejamos impementar no MySQL Server. As listas são apresentadas por versão, e os itens estão aproximadamente na ordem em que serão feitos.

Nota: Se você é um utilizador corporativo com uma necessidade urgente de um recurso particular, por favor, contate para conversarmos sobre patrocínio. Financiamento feito por uma ou mais companhias nos permite alocar recursos adicionais para aquele propósito específico. Um exemplo de um recurso patrocinado no passado é a replicação.

1.6.1. Novos Recursos Planejados Para a Versão 4.1

Os recursos abaixo ainda não estão implementados no MySQL 4.1, mass estão planejados para implementação antes que o MySQL 4.1 vá para a fase beta. Para uma lista do que já está feito no MySQL 4.1, veja Seção 1.5.2.1, “Recursos Disponíveis no MySQL 4.1”.

  • Suporte OpenSSL estável (o MySQL 4.0 tem suporte rudimentar ao OpenSSL, não testado 100%).

  • Mais teste de instruções preparadas

  • Mais testes de múltiplos conjunto de caracteres para uma tabela.

1.6.2. Novos Recursos Planejados Para a Versão 5.0

Os seguintes recursos estão planejados para inclusão no MySQL 5.0. Note que como possuimos diversos desenvolvedores que estão trabalhando em diferentes projetos, haverão também muitos recursos adicionais. Há também um pequena chance qie alguns destes recursos sejam adicionados ao MySQL 4.1. Para uma lista do que já está feito no MySQL 4.1, veja Seção 1.5.2.1, “Recursos Disponíveis no MySQL 4.1”.

Para aqueles que desejam dar uma olhada nas novidades do desenvolvimento do MySQL, deixamos nosso repositório BitKeeper para o MySQL versão 5.0 publicamente disponível. Veja mais informações sobre isto na Seção 2.3.4, “Instalando pela árvore de fontes do desenvolvimento”.

  • Stored Procedures

    • Stored procedures estão sendo implementadas atualmente. Este esforço é baseado no SQL-99, o que tem m sintaxe básica similar (mas não idêntica) a do Oracle PL/SQL. Nós também implementaremos o framework do SQL-99 para enganchar em linguagens externas e (onde possível) compatibilidade com p.ex. PL/SQL e T-SQL.

  • Nova funcionalidade

    • Suporte a cursores elementares.

    • A habilidade de especificar explicitamente para tabelas MyISAM que um índice deve ser criado como um índice RTREE. Na versão 4.1, índices RTREE são usados internamente para dados geométricos (tipos de dados GIS), mas não podem ser criados no pedido.

    • Registros de tamanhos dinâmicas para tabelas HEAP.

  • Compatibilidade com o padrão, portabilidade e migração

    • Adiciona suporte real a VARCHAR (tamanho de colunas maiores que 255, e sem corte de espaços em branco extras). (Já existe suporte para isto nos mecanismos de armazenamento do MyISAM, mas ainda não está disponível a nível de utilizador).

  • Aumento na velocidade

    • SHOW COLUMNS FROM nome_tabela (usado pelo cliente mysql para permitir expansões de nomes de colunas) não deve abrir a tabela, apenas o arquivo de definição. ISto exigirá menos memória e será muito mais rápido.

    • Permite que o DELETE em tabelas MyISAM usem a cache de registros. Para fazer isto, precisamos atualizar a thread da cache de registro quando atualizarmos os arquivos .MYD.

    • Melhores tabes em memória (HEAP):

      • Registro de tamanhos dinâmoicos.

      • Tratamento de registro mais rápido (menos cópia).

  • Internacionalização

    • Ap usar SET CHARACTER SET devemos traduzir toda a consulta de uma vez e não apenas as strings. Isto permitirá que os utilizadores usem caracteres traduzidos nos nomes de banco de dados, tabelas e colunas.

  • Aprimoramento da usabilidade

    • Resolver a questão de RENAME TABLE em uma tabela usada em uma tabela MERGE ativa, o que possivelmente corrompe a tabela.

1.6.3. Novos Recursos Planejados Para a Versão 5.1

  • Novas funcionalidades

    • Suporte FOREIGN KEY para todos os tipos de tabelas.

    • Restrições a nível de colunas.

    • Replicação seguro a falhas.

    • Backup online com baixa queda de desempenho. O backup online tornará mais fácil adicionar um novo slave de replicação sem desligar o master.

  • Aumento de velocidade

    • Novo formato dos arquivos de definição e tabelas baseados em texto (arquivos .frm) e uma cache de tabelas para a definição de tabelas. Isto nos permitirá fazer consultas mais rápidas da estruturas de tabela e dar um suporte a chaves estrangeiras mais eficiente.

    • Otimizar o tipo BIT para gastar 1 bit (agora BIT gasta 1 byte; e é tratado como um sinônimo para TINYINT.)

  • Aprimoramento da usabilidade

    • Adicionar opções ao protocolo cliente/servidor para obter notas de progresso para longos comandos em execução.

    • Implementar RENAME DATABASE. Para tornar isto seguro para todos os mecanismos de armazenamento, ele deve funcionar como a seguir:

      • Cria um novo banco de dados.

      • Para cada tabelas, renomeie-a para outro banco de dados, o qual fazemos com o comando RENAME.

      • Apagar o banco de dados antigo.

    • Nova alteração da interface de arquivo interno. Isto fará todos os manipuladores de arquivos mais gerais e tornará mais fácil adicionar extensões tipo RAID.

1.6.4. Novos Recursos Planejados Para a Versão em um Futuro Próximo

  • Novas funcionalidade

    • Comando como do Oracle CONNECT BY PRIOR ... para estruturas de busca tipo árvore (hierárquica)

    • Adicionar todos os tipos que faltam do SQL-92 e ODBC 3.0.

    • Adicionar SUM(DISTINCT).

    • INSERT SQL_CONCURRENT e mysqld --concurrent-insert para fazer uma inserção concorrente no fim do arquivo se o arquivo tiver lock de leitura.

    • Permitir a atualização de variáveis nas instruções UPDATE. Por exemplo: UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c.

    • Alterar quando as variáveis de utilizadores são atualizadas e assim pode se usá-las com GROUP BY, como no exemplo a seguir: SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM nome_tabela GROUP BY id.

    • Adicionar a opção IMAGE a LOAD DATA INFILE para não atualizar campos TIMESTAMP e AUTO_INCREMENT.

    • Adicionar a sintaxe LOAD DATA INFILE ... UPDATE que funciona assim:

      • Para tabelas com chaves primárias, se o registro de entrada contém um valor de chave primária, linhas existentes correspondendo às chaves primárias são atualizadas para o restante das colunas de entrada. No entanto, colunas faltosas na inserção dos registros de entradas não são alteradas.

      • Para tabelas com chaves primárias, se um registro de entrada não contém um valor de chave primária ou estrá faltando alguma parte da chave, o registro é tratado como um LOAD DATA INFILE ... REPLACE INTO.

    • Fazer com que LOAD DATA INFILE entenda a sintaxe do tipo:

      LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name
      TEXT_FIELDS (text_field1, text_field2, text_field3)
      SET table_field1=CONCAT(text_field1, text_field2),
      table_field3=23
      IGNORE text_field3
      

      Isto pode ser usado para saltar colunas extras no arquivo texto, ou atualizar colunas baseadas nas expressões dos dados lidos.

    • Novas funções para tyrabalhar com tipos de colunas SET:

      • ADD_TO_SET(valor,conjunto)

      • REMOVE_FROM_SET(valor,conjunto)

    • Se você abortar o mysql no meio de uma consulta, você deve abrir outra conexão e matar a consulta antiga em execução. Alternativamente, deve ser feita um tentativa de detecção deste problema no servidor.

    • Adicione um interface do mecanismo de armazenamento para informações da tabela assim que você puder usá-la como uma tabela de sistema. Isto seria um pouco mais lento se você pedisse informações sobre todas as tabelas, mas muito flexível. SHOW INFO FROM tbl_name para informações básicas das tabelas deve ser implementado.

    • Permite SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a); neste caso é considerado que a vem da tabela crash_me.

    • Opções DELETE e REPLACE para a instrução UPDATE (isto deletará registros quando se tiver um erro de chave duplicada durante a atualização).

    • Altera o formato de DATETIME para armazenar frações de segundo.

    • Possibilitar o uso da nova biblioteca regexp GNU em vez da atual (a biblioteca GNU deve ser muito mais rápida que a antiga).

  • Compatibilidade com os padrões, portabilidade e migração

    • Não adicionar valores DEFAULT automáticos as colunas. Enviar um erro ao usar um INSERT que não contenha uma coluna que não tenha um DEFAULT.

    • Adicionar as funções de agrupamento ANY(), EVERY() e SOME(). No padrão SQL isto só funciona em colunas booleanas, mas podemos extendê-las para funcionar em qualquer coluna/expressão tratando valores 0 como FALSE e valores diferentes de 0 como TRUE.

    • Corrigir para que o tipo de MAX(coluna) seja o mesmo do tipo da coluna:

      mysql> CREATE TABLE t1 (a DATE);
      mysql> INSERT INTO t1 VALUES (NOW());
      mysql> CREATE TABLE t2 SELECT MAX(a) FROM t1;
      mysql> SHOW COLUMNS FROM t2;
      

  • Aumento de velocidade

    • Não permitir mais que um número definido de threads façam a recuperação do MyISAM ao mesmo tempo.

    • Alterar INSERT ... SELECT para usar inserções concorrentes opcionalmente.

    • Adicionar uma opção para descarregar paginas de chaves para tabelas com delayed keys se elas não forem usados por um tempo.

    • Permitir joins em partes de chaves (otimização).

    • Adicionar simulação de pread()/pwrite() no Windows para permitir inserções concorrentes.

    • Um analizador de arquivos de log que possam analizar informações sobre quais tabelas são usadas com mais frequência, a frequência com que joins multi-tables são executados, etc. Isto deve ajudar os utilizadores a identificar áreas ou projetos de tabelas que podiam ser otimizados para executar consultas muito mais eficientes.

  • Internacionalização

  • Aprimoramentos de usabilidade

    • Retorna os tipos dos campos originais ao se fazer SELECT MIN(coluna) ... GROUP BY.

    • Possibilita especificar long_query_time com uma granularidade em microsegundos.

    • Ligue o código myisampack no servidor assim ele poderá realizar operações PACK e COMPRESS.

    • Adicionar uma cache de chaves temporária durante INSERT/DELETE/UPDATE para podermos fazer um recuperação se o índice ficar cheio.

    • Se você realizar um ALTER TABLE em uma tabela que é ligada simbolicamente a outro disco, crie tabelas tenporárias neste disco.

    • Implementar um tipo DATE/DATETIME que trate as informações de fusos horários de forma apropriada e assim lidar com datas em diferentes fusos horários será mais fácil.

    • Corrigir o configure para se poder compilar todas as bibliotecas (como no MyISAM) sem threads.

    • Permitir variáveis SQL em LIMIT, como em LIMIT @a,@b.

    • Saída automática do mysql para um navegador web.

    • LOCK DATABASES (com diversas opções).

    • Muito mais variáveis para SHOW STATUS. Leitura e atualização de registros. Selects em 1 tabela e select com joins. Número de tabelas na select. Número de consultas ORDER BY e GROUP BY.

    • mysqladmin copy database novo-banco_dados; exige que o comando COPY seja adicionado ao mysqld.

    • Lista de processos deve mostar o número de consultas/threads.

    • SHOW HOSTS para xibir informações sobre a cache de nome de máquina.

    • Alterar o nome de tabelas de string vazias para NULL para colunas calculadas.

    • Não usar Item_copy_string em valores numéricos para evitar a conversão number->string->number no casos de: SELECT COUNT(*)*(id+0) FROM nome_tabela GROUP BY id

    • Alterar aqueles ALTER TABLE que não abortam clientes que executam INSERT DELAYED.

    • Colunas referênciadas em uma cláusula UPDATE irão conter os valores antigos antes da atualização iniciar.

  • Novos sistemas operacioais.

    • Portar os clientes MySQL para LynxOS.

1.6.5. Novos Recursos Planejados Para a Versão em um Futuro a Médio Prazo

  • Implementar função: get_changed_tables(timeout,table1,table2,...)

  • Alterar leitura através de tabelas para usar mapeamento de memória quando possível. Atualmente somente tabelas compactadas usam mapeamento de memória.

  • Tornar o código de timestamp automático melhor. Adicionar timestamps para o log de atualizações com SET TIMESTAMP=#;

  • Usar mutex de leitura/escrita em alguns lugares para obter maior velocidade.

  • Views simples (inicialmente em uma tabela, depois em qualquer expressão). Veja mais informações sobre isto na Seção 1.8.4.6, “Views”.

  • Fechar algumas tabelas automaticamente se uma tabela, tabela temporária ou arquivos temporários obtiverem o erro 23 (não pode abrir arquivos suficientes).

  • Melhor propagação de constantes. Quando uma ocorrência de nome_col=n é encontrada em uma expressão, para algumas constantes n, substitua outras ocorrências de nome_col dentro da expressão por n. Atualmente, isto é feito somente para alguns casos simples.

  • Alterar todas expressões const com expressões calculadas se possível.

  • Chave otimizadora = expressão. No momento somente a chave = campo ou a chave = constante são otimizadas.

  • Melhorar o código de algumas das funções de cópia

  • Alterar sql_yacc.yy para um analizador em linha para reduzir seu tamanho e obter melhores mensagems de erro (5 dias).

  • Alterar o analisador para usar somente uma regra para diferentes números de argumentos em uma função.

  • Utilizar nomes de cálculo completos na parte de ordenação. (For ACCESS97)

  • MINUS, INTERSECT e FULL OUTER JOIN. (Atualmente UNION [na 4.0] e LEFT OUTER JOIN são suportados).

  • SQL_OPTION MAX_SELECT_TIME=# para colocar um limite de tempo em uma pesquisa.

  • Fazer o log de atualizações gravar em um banco de dados.

  • LIMIT negativo para recuperar dados do fim.

  • Alarmes em funções clientes de conexão, leitura e escrita.

  • Por favor, perceba as alterações ao mysqld_safe: de acordo com o FSSTND (que o Debian tenta seguir) arquivos PID dever ir em /var/run/<progname>.pid e arquivos de log em /var/log. Seria ótimo se você puder colocar o diretório de dados na primeira declaração de "pidfile" e "log", para que a colocação destes arquivos possa ser alterada com uma simples instrução.

  • Permitir um cliente requisitar log.

  • Adicionar uso de zlib() a LOAD DATA INFILE, para permitir que as instruções leiam arquivos compactados com gzip.

  • Corrigir ordenação e agrupamento de colunas BLOB (parcialmente resolvida agora).

  • Alterar para o uso de semáforos quando contar threads. Devemos primeiro implementar uma biblioteca de semáforos para a MIT-pthreads.

  • Adicionar suporte pleno para JOIN com parênteses.

  • Como uma alternativa para uma thread / conexão gerencie uma fila de threads para manipular as pesquisas.

  • Permitir obter mais de um bloqueio com GET_LOCK. Quando isto for feito, serão, também, tratados os possíveis deadlocks que essa alteração irá acarretar.

O tempo é fornecido de acordo com a quantidade de trabalho, e não tempo real.

1.6.6. Novos Recursos que Não Planejamos Fazer

  • Nada; Planejamos ser totalmente compatíveis com o ANSI 92 / ANSI 99.