Autor Zpráva
xpt26
Profil
Zdravím,

mám docela problém jak zoptimalizovat dotaz pro výběr náhodného řádku pomocí ORDER BY RAND() LIMIT 5

Zjistil jsem, že pro takový dotaz, kde se vlastně nepoužije klauzule WHERE, se prochází celá tabulka.
Napadlo mě třeba generovat náhodná čísla pomocí php samozřejmě v intervalu existujích ID-ček, a ověrovat je, zda skutečně existuje pod tímto číslem nějaký záznam v tabulce. Samozřejmě nejspíš jeden dotaz znamená zjistit poslední ID v tabulce. Pak ověřování, zda skutečně to ID existuje, což podle mě může být hodně dotazů.

A proto se ptám na nějaký lepší nápad/algoritmus na vybírání náhodných záznamů. Pomůže mi někdo ?
Kajman
Profil
Vygenerujte si více náhodných id, abyste měl rezervu, když se trefíte do neexistujícího.
Viz. 3 náhodné řádky z tabulky (třikrát ORDER BY RAND() LIMIT 1)

Případně si udělejte pomocný sloupeček se sekvenčními čísly bez mezer.
xpt26
Profil
Rozumim, to vypadá docela slibně. Děkuji :-)
xpt26
Profil
Ještě se chci zeptat. Kolik mam zhruba vygenerovat čísel? Aktuální nejvyšší ID je asi 250, ale skutečných záznamů je asi 40. Když jsem vygeneroval 50 náhodných čísel, tak mi to bohužel ze tří chtěných řádků z tabulky vrátilo pouze jeden, tak jsem zvýšil počet vygenerovaných čísel na 100. Lze nějak stanovit nějaký nejspíš poměr pro optimální počet vygenerovaných čísel ?
Kajman
Profil
Pokud máte v tabulce jen 50 řádků, tak optimalizujete něco, co není potřeba. Rozdíl nebude výrazný.

Pokud bude řádků více a bude platit, že chybějících id je příliš mnoho, natož několikrát více než používaných, přidejte si pomocný sloupec, kde budou sekvenčně čísla bez mezer - budete-li ho při každém smázání či přidání řádku udržovat, pak stačí vygenerovat v php přesný počet náhodných čísel. Mimo pomocný sloupec můžete použít i pomocnou tabulku.
xpt26
Profil
Jo, už rozumim, díky :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: