O MySql disponibiliza um recurso para determinar o tipo de armazenamento do dados, para cada tabela, dentro de um mesmo banco de dados, ou seja, é possível ter N tipos de tabela dentro de um mesmo banco de dados.
O tipo de armazenamento interfere nos recursos que ficam disponíveis para tabela, para saber quais tipos estão disponíveis na versão instalada execute:
SHOW ENGINES;
Tipo de armazenamento
• MyISAM – Esse tipo é o padrão, caso o tipo não seja especificado na criação da tabela. É possível alterar o padrão, abra o arquivo de configuração do mysql, e mude default-table-type=NOVO TIPO PADRÃO.
A tabela do tipo MyISAM é separada em 3 arquivos: .frm esse tipo de arquivo armazena a estrutura da tabela; .myd armazena os dados da tabela; E .myi armazena os índices da tabela, para esse arquivo existem uma convenção de nomes, os arquivos devem começar com o mesmo nome da tabela. Outro detalhe desse tipo de armazenamento é a capacidade de criar índices fulltext, com ele é possível buscar palavras em blocos de texto, com maior relevância.
A velocidade de leitura desse tipo é extremamente rápida.
Esse tipo não disponibiliza controle de transação e também não possui integridade referencial, ou seja, ao incluir uma chave estrangeira com alguns constraints, esta servirá apenas como documentação, mas as restrições não serão respeitadas. Nesse tipo também existe a opção RAID_TYPE(a partir da versão 4.1), permite dividir o armazenamento da tabela em vários arquivos, isso pode ser útil em alguns sistema operacionais que tem limite de tamanho por arquivo, como no Linux que tem limite de 2GB/4GB. Uma desvantagem nesse tipo é o lock por tabela que ele realiza em uma escrita na tabela, ou seja, a tabela é bloqueada até que escrita seja finalizada, criando uma fila para leitura.
• HEAD – Esse tipo é armazenado em memória, isso torna a velocidade leitura extremamente rápido, mas em contra partida os dados são voláteis, ao desligar o servidor MySql os dados serão perdidos, é recomendado para casos de muita leitura e pouca escrita.
• MERGE – Esse tipo disponibiliza a junção de N tabelas com a mesma estrutura, permitindo o acesso como se fosse uma tabela única.
Exemplo:
Crio 2 tabelas com a mesma estrutura
CREATE TABLE cliente1( nome VARCHAR(100) );
CREATE TABLE cliente2( nome VARCHAR(100) );
Insiro alguns dados
INSERT INTO cliente1 (nome) VALUES('Maria'); INSERT INTO cliente2 (nome) VALUES('José');
Crio a tabela do tipo MERGE, para unificar a estrutura das tabelas
CREATE TABLE cliente ( nome VARCHAR(100) ) TYPE = MERGE UNION = (cliente1, cliente2);
Visualizo os dados da tabela unificada
SELECT * FROM cliente;
Utilizando esse tipo de armazenamento é possível contornar o problema de tamanho limite do arquivo. As tabelas devem ser do tipo MyISAM, para serem unificadas
• BDB – Esse tipo de armazenamento permite o uso de transação, e fornece meios de recuperar de forma automática os dados, em caso de queda de servidor, uma vantagem é que o lock desse tipo é no nível de página, ou seja, ao escrever na tabela só a região (pagina onde o dado se encontra) se bloqueado, e não a tabela toda como no tipo MyISAM.
• InnoDB – Esse tipo também permite uso de transação, permite o uso de integridade referencial, armazena os dados em tablespace. A desvantagem é que esse tipo se apresenta um pouco mais lento que o MyISAM.
O ideal é que você pense em cada tipo de tabela, sabendo dos recursos acima, isso implicará bastante na resposta do sistema que consome o MySql.
Sintax de criação da tabela
CREATE TABLE cliente ( Nome VARCHAR(100) ) TYPE=MyISAM;
Mude o valor de Type para determinar o tipo
Espero que tenham gostado, até a próxima.
Srs, bom dia!
Existem alguma maneira de utilizar o TransactionScope no MySql?
O mesmo permite a utilização do TransactionScope quando for utilizado apenas uma conexão, se dentro da mesma conexão for necessário abrir outras conexões gera a seguinte exceção:
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
at MySql.Data.MySqlClient.ISSchemaProvider.GetTable(String sql)
at MySql.Data.MySqlClient.ISSchemaProvider.Query(String table_name, String initial_where, String[] keys, String[] values)
at MySql.Data.MySqlClient.ISSchemaProvider.GetProcedures(String[] restrictions)
at MySql.Data.MySqlClient.ISSchemaProvider.GetSchemaInternal(String collection, String[] restrictions)
at MySql.Data.MySqlClient.SchemaProvider.GetSchema(String collection, String[] restrictions)
at MySql.Data.MySqlClient.MySqlConnection.GetSchema(String collectionName, String[] restrictionValues)
at MySql.Data.MySqlClient.ProcedureCache.GetProcData(MySqlConnection connection, String spName)
at MySql.Data.MySqlClient.ProcedureCache.AddNew(MySqlConnection connection, String spName)
at MySql.Data.MySqlClient.ProcedureCache.GetProcedure(MySqlConnection conn, String spName, String cacheKey)
at MySql.Data.MySqlClient.StoredProcedure.GetParameters(String procName, DataTable& proceduresTable, DataTable& parametersTable)
at MySql.Data.MySqlClient.StoredProcedure.CheckParameters(String spName)
at MySql.Data.MySqlClient.StoredProcedure.Resolve(Boolean preparing)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
at Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteNonQuery(DbCommand command)
at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DbCommand command)
O problema está nas múltiplas conexões, há real necessidade de ter N conexões com o MySql?
Outro detalhe coloque a MessageException, você colocou apenas o StackTrace
André,
O motivo de ter várias conexões, se faz necessário pelo seguinte motivo: Por exemplo: dentro uma entidade Produto existem uma lista de descrições do produto!
No caso do MessageException, o retorno não ajudou muito:
Fatal error encountered during command execution.
Muito obrigado pelo retorno!
Acabei descobrindo algo baseado na sua resposta, que resolveu o problema!
Na pasta do projeto Class library NEGOCIO, não estava referenciado a MySql.Data.MySqlClient, fiz isso o funcionou perfeitamente!
Abraços,
José Dias