Algumas respostas:
-
20 milhões de linhas estão dentro da capacidade do MySQL. Eu trabalho em um banco de dados que tem mais de 500 milhões de linhas em uma de suas tabelas. Pode levar horas para reestruturar uma tabela, mas consultas comuns não são um problema, desde que sejam assistidas por um índice.
-
Seu laptop está bastante desatualizado e com pouca potência para ser usado como um servidor de banco de dados de alta escala. Vai levar muito tempo para fazer uma reestruturação da tabela. A baixa quantidade de memória e o disco normalmente lento do laptop provavelmente estão restringindo você. Você provavelmente também está usando as configurações padrão do MySQL, que são projetadas para funcionar em computadores muito antigos.
-
Eu não recomendaria usarTEXT
tipo de dados para todos coluna. Não há motivo para você precisar deTEXT
para a maioria dessas colunas.
-
Não crie um índice em cada coluna, especialmente se você insistir em usarTEXT
tipos de dados. Você não pode indexar umTEXT
coluna, a menos que você defina um índice de prefixo . Em geral, escolha índices para dar suporte a consultas específicas.
Você provavelmente tem muitas outras perguntas com base no exposto acima, mas há muito o que abordar em uma única postagem do StackOverflow. Você pode fazer um treinamento ou ler um livro se for trabalhar com bancos de dados.
Recomendo MySQL de alto desempenho, 2ª edição .
Re suas perguntas de acompanhamento:
Para ajuste do MySQL, aqui está um bom lugar para começar:http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/
Muitas operações ALTER TABLE causam uma reestruturação da tabela, o que significa basicamente bloquear a tabela, fazer uma cópia de toda a tabela com as alterações aplicadas e, em seguida, renomear as tabelas novas e antigas e descartar a tabela antiga. Se a mesa for muito grande, isso pode levar muito tempo.
Um tipo de dados TEXT pode armazenar até 64 KB, o que é um exagero para um número de telefone ou estado. Eu usaria CHAR(10) para um número de telefone típico dos EUA. Eu usaria CHAR(2) para um estado dos EUA. Em geral, use o tipo de dados mais compacto e econômico que dê suporte ao intervalo de dados que você precisa em uma determinada coluna.