Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como essa lógica de registros/fanout foi derivada para o caso sem estatísticas no Query Planner do MySQL?


Se você não tem absolutamente nenhum dado sobre o seu problema, você é forçado a fazer uma estimativa.

A forma geral dessa fórmula é explicada nos comentários:
  • se usarmos apenas uma coluna-chave (x ) de um índice de várias colunas (com c colunas), obtemos a linhas (1% do total de linhas). Portanto, para x=1 , o resultado é a por definição.
  • se soubermos o valor de cada coluna-chave de um índice de várias colunas, obteremos o número de linhas por chave inteira (b ); então para x=c , obtemos b linhas (que é 1 ou 10 ) por definição.
  • entre (se usarmos valores-chave para mais de 1 coluna-chave, mas não para todas), para cada valor-chave conhecido adicional, podemos excluir algumas linhas adicionais:temos a-b linhas que não pertencerão ao caso em que conhecemos nosso completo chave (que teria b linhas) e, por definição, eles devem ser excluídos proporcionalmente à proporção de colunas-chave utilizáveis ​​((x-1)/(c-1) ).
  • O -1 em (x-1)/(c-1) é apenas um deslocamento (você pode usar nomes de variáveis ​​diferentes), pois só precisamos contar os adicionais colunas, mas c e x é a contagem incluindo a primeira coluna. (Em uma série temporal, você chamaria o parâmetro para a primeira coluna t=0 , e o -1 faz exatamente isso).

Então, em conclusão, obtemos a - (a-b) * (x-1)/(c-1) (a para a primeira coluna chave menos as linhas que excluímos proporcionalmente). Esta é (se você transformar um pouco essa expressão) exatamente a fórmula dada. Uma rápida verificação de sanidade:para x=1 (x-1=0 ), o segundo termo é 0 e obtemos a , conforme definido pela primeira condição; para x=c , obtemos a-(a-b)=b como definido pela segunda condição.

Não é irracional fazer esse ansatz usando essas suposições, mas você provavelmente pode encontrar uma fórmula diferente que faça tanto sentido. Argumentar que é melhor seria uma tarefa mais difícil.

Depois, há a questão de escolher os valores (b=10 e 1% nesse caso). Obviamente, você pode escolher qualquer valor. Para fazer isso sem nenhum dado confiável, exceto uma intuição, existe um conceito chamado estimativa Fermi :

Você basicamente escolhe apenas a ordem de magnitude (1, 1000000, 1/100) para seus parâmetros de entrada e obtém uma ordem de magnitude razoável para seu resultado.

Então, quantas linhas você espera que uma chave não exclusiva cubra? É mais de 1, caso contrário você faria uma chave única, mas é mais como 2, 10 ou 100? 10 é provavelmente um bom palpite (abrange um valor de cerca de 3 a 30 nessa estimativa). Portanto, embora esses números possam ter vindo de uma pesquisa mundial de 2 anos sobre distribuição de chaves, os valores estimados em potências de 10 geralmente são derivados dessa maneira. Se você quiser ter certeza absoluta, pergunte ao desenvolvedor.

E o xkcd obrigatório para este tipo de tópicos:E se? Pinte a Terra