Autor | Zpráva | ||
---|---|---|---|
it47 Profil |
#1 · Zasláno: 16. 2. 2021, 11:09:59
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 |
#2 · Zasláno: 16. 2. 2021, 12:53:14
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 |
#3 · Zasláno: 16. 2. 2021, 12:58:33
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 |
#4 · Zasláno: 16. 2. 2021, 17:28:00
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 |
#5 · Zasláno: 16. 2. 2021, 18:36:34
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 |
#6 · Zasláno: 16. 2. 2021, 20:07:57
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 |
#7 · Zasláno: 17. 2. 2021, 10:12:58
Firibix: Kajman
Super, dakujem velmi pekne, toto zbehlo velmi rychlo :) |
||
Časová prodleva: 3 roky
|
0