Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment cette logique d'enregistrements/sortance a-t-elle été dérivée pour le cas d'absence de statistiques dans le planificateur de requêtes de MySQL ?

Si vous n'avez absolument aucune donnée sur votre problème, vous êtes obligé de faire une estimation.

La forme générale de cette formule est expliquée dans les commentaires :

  • si nous n'utilisons qu'une seule colonne clé (x ) d'un index multicolonne (avec c colonnes), nous obtenons a rangées (1 % du nombre total de rangées). Donc pour x=1 , le résultat est a par définition.
  • si nous connaissons la valeur de chaque colonne clé d'un index multicolonne, nous obtenons le nombre de lignes par clé entière (b ); donc pour x=c , on obtient b lignes (qui est 1 ou 10 ) par définition.
  • entre les deux (si nous utilisons des valeurs-clés pour plus d'une colonne clé, mais pas toutes), pour chaque valeur-clé connue supplémentaire, nous pouvons exclure quelques lignes supplémentaires :nous avons a-b lignes qui n'appartiendront pas au cas où nous connaissons notre full clé (qui aurait b rows), et par définition elles seront exclues proportionnellement au ratio de keycolumns utilisables ((x-1)/(c-1) ).
  • Le -1 en (x-1)/(c-1) est juste un décalage (vous pouvez simplement utiliser des noms de variables différents), car nous n'avons qu'à compter les supplémentaires colonnes, mais c et x est le nombre incluant la première colonne. (Dans une série temporelle, vous appelleriez le paramètre pour la première colonne t=0 , et le -1 fait exactement cela).

Donc en conclusion on obtient a - (a-b) * (x-1)/(c-1) (a pour la première colonne clé moins les lignes que nous excluons proportionnellement). C'est (si vous transformez un peu cette expression) exactement la formule donnée. Une vérification rapide :pour x=1 (x-1=0 ), le deuxième terme est 0 et nous obtenons a , tel que défini par la première condition ; pour x=c , on obtient a-(a-b)=b tel que défini par la deuxième condition.

Il n'est pas déraisonnable de faire cet ansatz en utilisant ces hypothèses, mais vous pouvez probablement trouver une formule différente qui a autant de sens. Affirmer que c'est mieux serait cependant une tâche plus difficile.

Reste ensuite à choisir les valeurs (b=10 et 1% dans ce cas). Vous pouvez évidemment choisir n'importe quelle valeur. Pour faire cela sans aucune donnée fiable à l'exception d'une intuition, il existe un concept appelé estimation de Fermi :

Vous choisissez simplement l'ordre de grandeur (1, 1000000, 1/100) pour vos paramètres d'entrée, et vous obtenez un ordre de grandeur raisonnable pour votre résultat.

Alors, combien de lignes pensez-vous qu'une clé non unique couvrira ? C'est plus que 1, sinon vous en feriez une clé unique, mais est-ce plutôt 2, 10 ou 100 ? 10 est probablement une bonne estimation (il couvre une valeur d'environ 3 à 30 dans cette estimation). Ainsi, bien que ces chiffres puissent provenir d'une enquête mondiale de 2 ans sur la distribution des clés, les valeurs estimées en puissances de 10 sont généralement dérivées d'une manière comme celle-là. Si vous voulez être absolument certain, demandez au développeur.

Et le xkcd obligatoire pour ce genre de sujets :What-if ? Peindre la Terre