Mysql
 sql >> база данни >  >> RDS >> Mysql

Как е получена тази логика на записите/разклоненията за случая без статистически данни в MySQL Query Planner?

Ако нямате абсолютно никакви данни за проблема си, сте принудени да направите оценка.

Общата форма на тази формула е обяснена в коментарите:

  • ако използваме само една ключова колона (x ) на индекс с много колони (с c колони), получаваме a редове (1% от общите редове). Така че за x=1 , резултатът е a по дефиниция.
  • ако знаем стойността за всяка ключова колона от многоколонов индекс, получаваме броя на редовете на цял ключ (b ); така че за x=c , получаваме b редове (което е 1 или 10 ) по дефиниция.
  • между (ако използваме ключови стойности за повече от 1 ключова колона, но не всички), за всяка допълнителна известна ключова стойност, можем да изключим някои допълнителни редове:имаме a-b редове, които няма да принадлежат на случая, в който знаем пълно ключ (който ще има b редове) и по дефиниция те трябва да бъдат изключени пропорционално на съотношението на използваемите ключови колони ((x-1)/(c-1) ).
  • -1 в (x-1)/(c-1) е просто смяна (можете просто да използвате различни имена на променливи), тъй като трябва да преброим само допълнителните колони, но c и x е броят, включително първата колона. (В времеви серии бихте извикали параметъра за първата колона t=0 и -1 прави точно това).

Така в заключение получаваме a - (a-b) * (x-1)/(c-1) (a за първата ключова колона минус редовете, които пропорционално изключваме). Това е (ако трансформирате малко този израз) точно дадената формула. Бърза проверка за здравина:За x=1 (x-1=0 ), вторият член е 0 и получаваме a , както е определено от първото условие; за x=c , получаваме a-(a-b)=b както е определено от второто условие.

Не е неразумно да направите този анзац, използвайки тези предположения, но вероятно можете да намерите различна формула, която има толкова смисъл. Въпреки това да се твърди, че е по-добре, би било по-трудна задача.

След това е въпросът за избор на стойности (b=10 и 1% в такъв случай). Очевидно можете да изберете всяка стойност. За да направите това без никакви надеждни данни, с изключение на интуитивно усещане, има концепция, наречена оценка на Ферми :

По принцип избирате само порядъка на магнитите (1, 1000000, 1/100) за вашите входни параметри и получавате разумен порядък на величината за вашия резултат.

И така, колко реда очаквате да покрие неуникален ключ? Това е повече от 1, иначе бихте го направили уникален ключ, но дали е по-скоро 2, 10 или 100? 10 вероятно е добро предположение (то обхваща стойност от около 3 до 30 в тази оценка). Така че, въпреки че тези числа биха могли да дойдат от 2-годишно световно проучване относно разпределението на ключовете, приблизителните стойности в степените на 10 обикновено се извличат по този начин. Ако искате да сте абсолютно сигурни, попитайте разработчика.

И задължителният xkcd за този вид теми:Какво-ако? Нарисувайте Земята




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memcache - съхраняване на mysql резултати

  2. Получаване на PHP PDO връзка от mysql_connect()?

  3. Възможно ли е да се предадат новите и СТАРИТЕ таблици от тригер в процедура в MySQL?

  4. REPLACE INTO срещу Update

  5. Архивиране на база данни(и) с помощта на заявка без използване на mysqldump