sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo se derivó esta lógica de registros/fanout para el caso sin estadísticas en el Planificador de consultas de MySQL?

Si no tiene absolutamente ningún dato sobre su problema, se ve obligado a hacer una estimación.

La forma general de esa fórmula se explica en los comentarios:

  • si usamos solo una columna clave (x ) de un índice de varias columnas (con c columnas), obtenemos a filas (1% del total de filas). Así que para x=1 , el resultado es a por definición.
  • si conocemos el valor de cada columna clave de un índice de varias columnas, obtenemos el número de filas por clave completa (b ); entonces para x=c , obtenemos b filas (que es 1 o 10 ) por definición.
  • en el medio (si usamos valores clave para más de una columna clave, pero no para todas), para cada valor clave conocido adicional, podemos excluir algunas filas adicionales:tenemos a-b filas que no pertenecerán al caso donde conocemos nuestro completo clave (que tendría b filas) y, por definición, se excluirán proporcionalmente a la proporción de columnas clave utilizables ((x-1)/(c-1) ).
  • El -1 en (x-1)/(c-1) es solo un cambio (podría usar diferentes nombres de variables), ya que solo necesitamos contar los adicionales columnas, pero c y x es el recuento que incluye la primera columna. (En una serie temporal, llamaría al parámetro de la primera columna t=0 y el -1 hace exactamente eso).

Entonces, en conclusión, obtenemos a - (a-b) * (x-1)/(c-1) (a para la primera columna clave menos las filas que excluimos proporcionalmente). Esta es (si transformas un poco esa expresión) exactamente la fórmula dada. Una comprobación rápida de cordura:para x=1 (x-1=0 ), el segundo término es 0 y obtenemos a , tal como se define en la primera condición; para x=c , obtenemos a-(a-b)=b como se define en la segunda condición.

No es irrazonable hacer este ansatz usando estas suposiciones, pero probablemente puedas encontrar una fórmula diferente que tenga tanto sentido. Sin embargo, argumentar que es mejor sería una tarea más difícil.

Luego está la cuestión de elegir los valores (b=10 y 1% en este caso). Obviamente, puede elegir cualquier valor. Para hacer esto sin datos confiables excepto una intuición, existe un concepto llamado estimación de Fermi :

Básicamente, elige solo el orden de magnitud (1, 1000000, 1/100) para sus parámetros de entrada y obtiene un orden de magnitud razonable para su resultado.

Entonces, ¿cuántas filas espera que cubra una clave no única? Es más de 1, de lo contrario, la convertiría en una clave única, pero ¿es más como 2, 10 o 100? 10 es probablemente una buena suposición (cubre un valor de aproximadamente 3 a 30 en esa estimación). Entonces, aunque estos números podrían provenir de una encuesta mundial de 2 años sobre la distribución de claves, los valores estimados en potencias de 10 generalmente se derivan de esa manera. Si quiere estar absolutamente seguro, pregunte al desarrollador.

Y el xkcd obligatorio para este tipo de temas:What-if? Pintar la tierra