sql >> Databáze >  >> RDS >> Mysql

Jak byla tato logika záznamů/fanout odvozena pro případ bez statistiky v MySQL Query Planner?

Pokud nemáte absolutně žádná data o svém problému, jste nuceni provést odhad.

Obecná forma tohoto vzorce je vysvětlena v komentářích:

  • pokud použijeme pouze jeden klíčový sloupec (x ) vícesloupcového indexu (s c sloupce), dostaneme a řádků (1 % z celkového počtu řádků). Tedy pro x=1 , výsledkem je a podle definice.
  • pokud známe hodnotu každého klíčového sloupce vícesloupcového indexu, získáme počet řádků na celý klíč (b ); takže pro x=c , dostaneme b řádků (což je 1 nebo 10 ) podle definice.
  • mezi (pokud použijeme klíčové hodnoty pro více než 1 klíčový sloupec, ale ne pro všechny), můžeme pro každý další známý klíčový pár vyloučit některé další řádky:máme a-b řádky, které nebudou patřit do případu, kdy víme plné klíč (který by měl b řádky) a podle definice by měly být vyloučeny úměrně poměru použitelných klíčových sloupců ((x-1)/(c-1) ).
  • -1 v (x-1)/(c-1) je pouze posun (mohli byste použít jiné názvy proměnných), protože potřebujeme započítat pouze další sloupce, ale c a x je počet včetně prvního sloupce. (V časové řadě byste zavolali parametr pro první sloupec t=0 a -1 dělá přesně to).

Na závěr tedy dostáváme a - (a-b) * (x-1)/(c-1) (a pro první klíčový sloupec mínus řádky, které proporcionálně vyloučíme). Toto je (pokud ten výraz trochu transformujete) přesně daný vzorec. Rychlá kontrola zdravého rozumu:Pro x=1 (x-1=0 ), druhý výraz je 0 a dostaneme a , jak je definováno první podmínkou; pro x=c , dostaneme a-(a-b)=b jak je definováno druhou podmínkou.

Není nerozumné vytvořit tento ansatz pomocí těchto předpokladů, ale pravděpodobně můžete najít jiný vzorec, který dává stejný smysl. Argumentovat tím, že je to lepší, by však byl těžší úkol.

Pak je tu otázka výběru hodnot (b=10 a 1% v tomto případě). Samozřejmě si můžete vybrat jakoukoli hodnotu. Chcete-li to provést bez jakýchkoli spolehlivých údajů kromě pocitu střeva, existuje koncept zvaný Fermiho odhad :

Pro své vstupní parametry si v zásadě vyberete jen řád magnitu (1, 1000000, 1/100) a získáte přiměřenou řádovou hodnotu pro váš výsledek.

Kolik řádků tedy očekáváte, že pokryje nejedinečný klíč? Je to více než 1, jinak byste z něj udělali jedinečný klíč, ale je to spíše 2, 10 nebo 100? 10 je pravděpodobně dobrý odhad (pokrývá hodnotu přibližně od 3 do 30 v tomto odhadu). Takže ačkoli tato čísla mohla pocházet z dvouletého celosvětového průzkumu o distribuci klíčů, odhadované hodnoty v mocninách 10 jsou obvykle odvozeny tímto způsobem. Pokud si chcete být naprosto jisti, zeptejte se vývojáře.

A povinné xkcd pro tento druh témat:Co kdyby? Malovat Zemi




  1. Jak vytvořit tunel ssh v ruby ​​a poté se připojit k serveru mysql na vzdáleném hostiteli

  2. OperationalError:(1045, přístup odepřen uživateli 'rajendra'@'localhost' (s použitím hesla:NE))

  3. Oracle SQL:Jak používat více než 1000 položek uvnitř klauzule IN

  4. Najděte nejbližší datum k zadanému datu v dotazu mysql