sql >> Database teknologi >  >> RDS >> Mysql

Hvordan blev denne logik for registreringer/fanout afledt for tilfældet uden statistik i MySQL's Query Planner?

Hvis du absolut ingen data har om dit problem, er du tvunget til at lave et skøn.

Den generelle form for denne formel er forklaret i kommentarerne:

  • hvis vi kun bruger én nøglekolonne (x ) af et indeks med flere kolonner (med c kolonner), får vi a rækker (1 % af det samlede antal rækker). Så for x=1 , resultatet er a Per definition.
  • hvis vi kender værdien for hver nøglekolonne i et multikolonneindeks, får vi antallet af rækker pr. hel nøgle (b ); så for x=c , får vi b rækker (som er 1 eller 10 ) per definition.
  • imellem (hvis vi bruger nøgleværdier til mere end 1 nøglekolonne, men ikke alle), kan vi for hver yderligere kendt nøgleværdi ekskludere nogle yderligere rækker:vi har a-b rækker, der ikke vil tilhøre det tilfælde, hvor vi kender vores fulde nøgle (som ville have b rækker), og de skal per definition udelukkes proportionalt med forholdet mellem anvendelige nøglekolonner ((x-1)/(c-1) ).
  • -1 i (x-1)/(c-1) er kun et skift (du kan bare bruge forskellige variabelnavne), da vi kun behøver at tælle de yderligere kolonner, men c og x er tallet inklusive den første kolonne. (I en tidsserie vil du kalde parameteren for den første kolonne t=0 , og -1 gør præcis det).

Så afslutningsvis får vi a - (a-b) * (x-1)/(c-1) (a for den første nøglekolonne minus rækkerne, vi proportionelt udelukker). Dette er (hvis du transformerer det udtryk en smule) præcis den angivne formel. Et hurtigt fornuftstjek:For x=1 (x-1=0 ), det andet led er 0 og vi får a , som defineret af den første betingelse; for x=c , får vi a-(a-b)=b som defineret af den anden betingelse.

Det er ikke urimeligt at lave denne ansatz ved at bruge disse antagelser, men du kan sikkert finde en anden formel, der giver lige så meget mening. At argumentere for, at det er bedre, ville dog være en sværere opgave.

Så er der et spørgsmål om at vælge værdierne (b=10 og 1 % I dette tilfælde). Du kan naturligvis vælge enhver værdi. For at gøre dette uden pålidelige data bortset fra en mavefornemmelse er der et koncept kaldet Fermi-estimat :

Du vælger stort set kun størrelsesordenen (1, 1000000, 1/100) til dine inputparametre, og du får en rimelig størrelsesorden for dit resultat.

Så hvor mange rækker forventer du, at en ikke-unik nøgle skal dække? Det er mere end 1, ellers ville du gøre det til en unik nøgle, men er det mere som 2, 10 eller 100? 10 er sandsynligvis et godt gæt (det dækker værdi fra omkring 3 til 30 i det skøn). Så selvom disse tal kunne være kommet fra en 2-årig verdensomspændende undersøgelse om nøglefordeling, er estimerede værdier i potenser på 10 normalt udledt på en måde som denne. Spørg udvikleren, hvis du vil være helt sikker.

Og den obligatoriske xkcd for denne slags emner:What-if? Mal jorden




  1. INNER JOIN ON vs WHERE-klausul

  2. SQL WHERE betingelse er ikke lig med?

  3. Undgå sorteringer med Merge Join-sammenkædning

  4. SQL Developer 4.1.3 udgivet