sql >> Databasteknik >  >> RDS >> Mysql

Hur härleddes denna logik för registreringar/fanout för fallet utan statistik i MySQL:s frågeplanerare?

Om du absolut inte har några uppgifter om ditt problem, är du tvungen att göra en uppskattning.

Formelns allmänna form förklaras i kommentarerna:

  • om vi bara använder en nyckelkolumn (x ) av ett index med flera kolumner (med c kolumner), får vi a rader (1 % av det totala antalet rader). Så för x=1 , resultatet är a per definition.
  • om vi vet värdet för varje nyckelkolumn i ett flerkolumnsindex får vi antalet rader per hel nyckel (b ); så för x=c , får vi b rader (som är 1 eller 10 ) per definition.
  • däremellan (om vi använder nyckelvärden för mer än 1 nyckelkolumn, men inte alla), för varje ytterligare känt nyckelvärde kan vi utesluta några ytterligare rader:vi har a-b rader som inte kommer att tillhöra fallet där vi vet vår fulla nyckel (som skulle ha b rader), och per definition ska de exkluderas proportionellt mot förhållandet mellan användbara nyckelkolumner ((x-1)/(c-1) ).
  • -1 i (x-1)/(c-1) är bara ett skift (du kan bara använda olika variabelnamn), eftersom vi bara behöver räkna de ytterligare kolumner, men c och x är räkningen inklusive den första kolumnen. (I en tidsserie skulle du anropa parametern för den första kolumnen t=0 och -1 gör precis det).

Så avslutningsvis får vi a - (a-b) * (x-1)/(c-1) (a för den första nyckelkolumnen minus raderna vi proportionellt exkluderar). Detta är (om du omvandlar det uttrycket lite) exakt den formel som ges. En snabb förnuftskontroll:För x=1 (x-1=0 ), den andra termen är 0 och vi får a , såsom definieras av det första villkoret; för x=c , får vi a-(a-b)=b som definieras av det andra villkoret.

Det är inte orimligt att göra denna ansatz med dessa antaganden, men du kan förmodligen hitta en annan formel som är lika vettig. Att hävda att det är bättre skulle dock vara en svårare uppgift.

Sedan är det frågan om att välja värden (b=10 och 1% I detta fall). Du kan självklart välja vilket värde som helst. För att göra detta utan tillförlitlig data förutom en magkänsla, finns det ett koncept som kallas Fermi-uppskattningen :

Du väljer i princip bara storleksordningen (1, 1000000, 1/100) för dina inmatningsparametrar, och du får en rimlig storleksordning för ditt resultat.

Så hur många rader förväntar du dig att en icke-unik nyckel ska täcka? Det är mer än 1, annars skulle du göra det till en unik nyckel, men är det mer som 2, 10 eller 100? 10 är förmodligen en bra gissning (den täcker värde från cirka 3 till 30 i den uppskattningen). Så även om dessa siffror kunde ha kommit från en 2-årig världsomspännande undersökning om nyckelfördelning, kommer uppskattade värden i potenser 10 vanligtvis på ett sådant sätt. Om du vill vara helt säker, fråga utvecklaren.

Och den obligatoriska xkcd för den här typen av ämnen:What-if? Måla jorden




  1. Välj inkrementerat heltal

  2. Mysql group_concat med summor också inuti

  3. MYSQL hitta hur olika två textfält är?

  4. Failover-stöd för en DB