Pergunta
Quais otimizações devo empregar para tornar esse banco de dados gerenciável? Eu li muitos posts sobre como otimizar grandes dbs, mas sou muito novo, então é difícil determinar quais técnicas são adequadas para minha configuração.
Informações do banco de dados
Carreguei cerca de 90 mil linhas de flatfile csvs em um banco de dados mysql (aws RDS, se isso importa). Existem 60 colunas e cada linha é um clique em um site.
Tipos de dados: Todos os tipos de dados são texto devido às limitações do utilitário mysqlimport (especificamente, seu tratamento de valores nulos vs. 0 em campos numéricos, sobre os quais posso estar errado)
Cada coluna cai em uma destas categorias:
Informações da visita: hora, referenciador, etc. Muitas páginas registram milhões de visitas (primeira página, por exemplo), algumas registram apenas algumas.
Informações do usuário: cidade/estado, etc. Os usuários registram de 1 a milhares de visitas, com a distribuição distorcida à direita.
Informações da página: url, sinalizadores de conteúdo, etc.
IO - O banco de dados tem apenas 4 usuários, então não terá muito I/O, principalmente apenas consultas para preencher dataframes em nosso ambiente de análise de dados python.
índices - nenhum além do índice padrão gerado. Os candidatos para indexação são o ID do usuário e o carimbo de data/hora da exibição da página (potencialmente um índice de várias colunas?)
Opções
Aceito quaisquer outras ideias, mas é isso que eu criei com algumas pesquisas. Interessado em saber quais etapas valem a pena e quais não valem.
dimensionar corretamente o tipo de dados de cada campo - isso oferece aumento de desempenho? a maioria dos campos são sinalizadores de texto ou booleanos.
divida a tabela em pelo menos 2 outras, por exemplo, visite informações e informações da página.
Mantenha-o em uma tabela e particione-o. Pelo que li, acho que particionar no campo consultado com mais frequência é a escolha ideal.
OPTIMIZE TABLE
quase sempre não vale a pena fazer.INDEXes
são seus amigos - eles podem (em muitos casos) fazer consultas executar ordens de magnitude mais rapidamente. Forneça uma consulta lenta, maisSHOW CREATE TABLE
, e podemos ajudá-lo. Ou estude meu livro de receitas . Como dito, escolher o índice 'certo' (talvez um índice composto) requer que você primeiro tenha algumas pistas doSELECTs
que estará fazendo.O "dimensionamento correto" dos tipos de dados é uma boa ideia, especialmente ao criar as tabelas pela primeira vez. Menor --> mais armazenável em cache --> menos I/O --> mais rápido.
Duas tabelas (informações da visita e informações da página)? Se forem 1:1, geralmente 1 mesa é 'certa'; se forem 1:muitos, então duas tabelas são obrigatórias.