Estamos projetando um sistema que é conhecido por ser de leitura pesada (da ordem de dezenas de milhares de leituras por minuto).
- Há uma tabela
names
que serve como uma espécie de registro central. Cada linha tem umtext
camporepresentation
e um exclusivokey
que é um hash MD5 daquelerepresentation
. 1 Esta tabela tem atualmente dezenas de milhões de registros e espera-se que cresça em bilhões ao longo da vida útil do aplicativo. - Existem dezenas de outras tabelas (de esquemas e contagens de registros altamente variados) que fazem referência à
names
tabela. Qualquer registro em uma dessas tabelas tem a garantia de ter umname_key
, que é funcionalmente uma chave estrangeira para anames
tabela.
1: Aliás, como você pode esperar, os registros nesta tabela são imutáveis uma vez gravados.
Para qualquer tabela que não seja a names
tabela, a consulta mais comum seguirá este padrão:
SELECT list, of, fields
FROM table
WHERE name_key IN (md5a, md5b, md5c...);
Eu gostaria de otimizar o desempenho de leitura. Suspeito que minha primeira parada deve ser minimizar o tamanho dos índices (embora eu não me importe de ser provado errado lá).
A pergunta:
Qual é/são os tipos de dados ideais para as colunas key
e ?
Existe uma razão para usar mais ? ou ?name_key
hex(32)
bit(128)
BTREE
GIN