Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie wurde diese Records/Fanout-Logik für den Fall ohne Statistik im Abfrageplaner von MySQL abgeleitet?

Wenn Sie absolut keine Daten zu Ihrem Problem haben, müssen Sie eine Schätzung vornehmen.

Die allgemeine Form dieser Formel wird in den Kommentaren erklärt:

  • Wenn wir nur eine Schlüsselspalte verwenden (x ) eines mehrspaltigen Indexes (mit c Spalten), erhalten wir a Zeilen (1 % aller Zeilen). Also für x=1 , das Ergebnis ist a per Definition.
  • wenn wir den Wert für jede Schlüsselspalte eines mehrspaltigen Indexes kennen, erhalten wir die Anzahl der Zeilen pro gesamtem Schlüssel (b ); also für x=c , erhalten wir b Zeilen (das ist 1 oder 10 ) per Definition.
  • dazwischen (wenn wir Schlüsselwerte für mehr als eine Schlüsselspalte verwenden, aber nicht für alle), können wir für jeden zusätzlichen bekannten Schlüsselwert einige zusätzliche Zeilen ausschließen:wir haben a-b Zeilen, die nicht zu dem Fall gehören, in dem wir unsere vollständigen kennen Schlüssel (der b hätte Zeilen), und per Definition sollen sie proportional zum Verhältnis der nutzbaren Schlüsselspalten ((x-1)/(c-1)) ausgeschlossen werden ).
  • Der -1 in (x-1)/(c-1) ist nur eine Verschiebung (Sie könnten einfach andere Variablennamen verwenden), da wir nur die zusätzlichen zählen müssen Spalten, sondern c und x ist die Anzahl einschließlich der ersten Spalte. (In einer Zeitreihe würden Sie den Parameter für die erste Spalte aufrufen t=0 , und die -1 tut genau das).

Als Schlussfolgerung erhalten wir also a - (a-b) * (x-1)/(c-1) (a für die erste Schlüsselspalte abzüglich der Zeilen, die wir proportional ausschließen). Dies ist (wenn Sie diesen Ausdruck ein wenig umwandeln) genau die angegebene Formel. Eine schnelle Plausibilitätsprüfung:Für x=1 (x-1=0 ), ist der zweite Term 0 und wir erhalten a , wie durch die erste Bedingung definiert; für x=c erhalten wir a-(a-b)=b wie durch die zweite Bedingung definiert.

Es ist nicht unvernünftig, diesen Ansatz unter Verwendung dieser Annahmen zu machen, aber Sie können wahrscheinlich eine andere Formel finden, die genauso viel Sinn macht. Zu argumentieren, dass es besser ist, wäre jedoch eine schwierigere Aufgabe.

Dann geht es um die Auswahl der Werte (b=10 und 1% in diesem Fall). Sie können natürlich einen beliebigen Wert wählen. Um dies ohne zuverlässige Daten außer einem Bauchgefühl zu tun, gibt es ein Konzept namens Fermi-Schätzung :

Sie wählen im Grunde nur die Größenordnung von Magnite (1, 1000000, 1/100) für Ihre Eingabeparameter und erhalten eine vernünftige Größenordnung für Ihr Ergebnis.

Wie viele Zeilen soll also ein nicht eindeutiger Schlüssel abdecken? Es ist mehr als 1, sonst würden Sie es zu einem eindeutigen Schlüssel machen, aber ist es eher 2, 10 oder 100? 10 ist wahrscheinlich eine gute Schätzung (es deckt Werte von etwa 3 bis 30 in dieser Schätzung ab). Obwohl diese Zahlen aus einer zweijährigen weltweiten Umfrage zur Schlüsselverteilung stammen könnten, werden geschätzte Werte in Zehnerpotenzen normalerweise auf diese Weise abgeleitet. Wenn Sie ganz sicher gehen wollen, fragen Sie den Entwickler.

Und das obligatorische xkcd für diese Art von Themen:Was-wäre-wenn? Malen Sie die Erde