Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: chování dotazu like (mariadb)

Aktivity
Avatar
VelkyBubak
Člen
Avatar
VelkyBubak:31.7.2016 21:05

ahojky.
potřebuju zjistit, jestli je rozdíl mezi dotazy:

#1
select * from tabulka where id>50 and typ like '%'
#2
select * from tabulka where id>50

je mi jasné že typ like '%' tam v podstatě nemusí být, ale zajímalo by mne jaký to má vliv na dotaz, jestli nějaký
v podstatě mě zajímá jestli je #1 náročnější na provedení (jestli se vážně prohledává ono pole na přítomnost jakéhokoliv textu) a mohla by díky němu DB zkolabovat

 
Odpovědět
31.7.2016 21:05
Avatar
roverjedla
Člen
Avatar
roverjedla:31.7.2016 21:58

Ahoj,

neměl by být, jelikož ty podmínkuješ jen to, že id musí být větší než 50 (v obou případech).
Typ like by fungoval takto:

like '%x' -> řetězec končí na x
like 'x%' -> řetězec začíná na x

V tvém případě je to použité úplně zbytečně.
Raději jsem to i vyzkoušel a výsledek je úplně stejný.

Snad jsem pomohl, roverjedla.

 
Nahoru Odpovědět
31.7.2016 21:58
Avatar
roverjedla
Člen
Avatar
roverjedla:31.7.2016 22:00

Kdyby nebylo okoli like něco jasné tak tady je to velmi jednoduše vysvětlené:
w3

 
Nahoru Odpovědět
31.7.2016 22:00
Avatar
VelkyBubak
Člen
Avatar
Odpovídá na roverjedla
VelkyBubak:1.8.2016 7:40

Souhlasím s tím že je použito zbytečně (což jsem zmiňoval již na začátku), ale na uvedeném odkazu je právě vysvětlené jak se to chová s textem. Mě zajímá, co se stane když se to použije bez jakéhokoliv dalšího znaku.
Jestli DB pozná že to je zbytečné hledat a hledá stejně jako ve 2), nebo jestli se všechny pole typ testujou na přítomnost (třeba i prázdného řetězce).

 
Nahoru Odpovědět
1.8.2016 7:40
Avatar
Odpovídá na VelkyBubak
Michal Štěpánek:1.8.2016 7:49

Ono hodně záleží na tom, jestli má DB 350 záznamů, nebo milion. Hledání podle textu je vždycky malinko pomalejší a počet záznamů dobu zpracování dotazu pak může výrazně ovlivnit...
EDIT: Asi by to bylo potřeba otestovat na hooodně velkém počtu záznamů...

Editováno 1.8.2016 7:50
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
1.8.2016 7:49
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Richard
Člen
Avatar
Odpovídá na VelkyBubak
Richard:1.8.2016 8:17

Mysql je poměrně hloupý, takže optimizer ten zbytečný like nedá pryč a hledá odpovídající záznamy.

Nahoru Odpovědět
1.8.2016 8:17
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
Honza
Člen
Avatar
Odpovídá na VelkyBubak
Honza:1.8.2016 10:25

Nemám nainstalovanou Mysql databázi, takže to nemůžu vyzkoušet. Ale otestuj si, jestli ti ta verze dotazu kde máš like nevyřadí z výsledku záznamy, kde je ve sloupci "typ" null. Nicméně si myslím že při větším počtu záznamů by snížení výkonu mohlo být znát.

Nahoru Odpovědět
1.8.2016 10:25
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.