Autor Zpráva
it47
Profil
Ahojte,

mam SQL dopyt:

SELECT * FROM slovnik ORDER by id ASC LIMIT 450000, 5 a trva az 6 sekund.

Preco? Ved ID je primary key a malo byt to byt vykonane v podstate hned.

Kebyze dopyt upravim na:

SELECT * FROM vyhladavanie_top WHERE id >= 450000 LIMIT 5 tak je vykonany hned za 0.0021 sekund.

Vopred dakujem velmi pekne.

it47
Kajman
Profil
V prvním dotaze se sice může použít index, ale v něm se musí postupně přeskočit 450 000 záznamů (operací nad indexem) a pak se teprve pět přečte.

V druhém dotaze se najde id, což bude dle mohutnosti dat odhadem třeba jen 20 operací nad indexem a pak se pět přečte.

Vzhledem k tomu, že u id se nedá obecně předpokládat souvislá řada, tak v případě takovýchto dotazů bych si udělal pomocný indexovaný sloupec s jedinečným pořadím bez mezer a nad ním používal např.
poradi between 450001 and 450005
Keeehi
Profil
it47:
Protože to jsou dva rozdílné dotazy které mohou vratit různé výsledky. Stejný výsledek vrátí pouze v případě že sloupec id je číslován od jedničky a nejsou v něm díry. Na což ty spoléháš. Ovšem obecně to nemusí být pravda, takže ta optimalizace, kterou očekáváš, že by se měla použít se použít nemůže.
it47
Profil
Kajman, Keeehi:

Dakujem velmi pekne za vysvetlenie.

A ako by ste teda vy ten SQL dopyt napisali, aby som dosiahol pozadovany vysledok a zaroven aby to bolo co najrychlejsie?

Vopred dakujem velmi pekne.

it47
Firibix
Profil
Reakce na it47:
Ještě bys mohl zkusit nejprve najít klíče požadovaných řádků bez načítání dat v ostatních sloupcích a zbytek sloupců připojit až k vyfiltrovaným záznamům:

SELECT slovnik.*
FROM (
  SELECT id FROM slovnik ORDER BY id LIMIT 450000, 5
) sq
JOIN slovnik ON sq.id = slovnik.id
ORDER BY slovnik.id;
Kajman
Profil
it47:
A ako by ste teda vy ten SQL dopyt napisali, aby som dosiahol pozadovany vysledok a zaroven aby to bolo co najrychlejsie?

Však jsem to psal.
it47
Profil
Firibix: Kajman
Super, dakujem velmi pekne, toto zbehlo velmi rychlo :)

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:

0