Autor Zpráva
Casero
Profil
Dobrý večer,
řeším porovnávání dvou záznamů ze stejné tabulky a nevím zda to řešit rovnou v mysql:

SELECT hraci.obrana - h.obrana AS rozdil
FROM `hraci` , hraci AS h
WHERE hraci.idhrace =1
AND h.idhrace =4

a nebo až v php...jak by ste to řešili (řešíte) vy???..co je rychlejší, lepší?
25k
Profil *
No co se ti na tom nezda? Tohle musi byt rychle jak blesk
Casero
Profil
25k
No je to docela rychlé, jen prostě mi to příde divné, nikde jinde sem se s takovýmto řešením nesetkal. Tak se ptám, jestli to nemá nějaké úskalí.
Peca
Profil
Řekl bych, že u velikých tabulek to bude naopak hodně pomalé. Vytváří se tam kartézký součin (přesněji řečeno druhá mocnina), což není nic moc. Vybrání dvou záznamů (where idhrace=1 or idhrace=4) bude podstatně rychlejší a odečíst je v php není problém. Teda pokud jsem problém správně pochopil...
Casero
Profil
Peca
Vytváří se tam kartézký součin (přesněji řečeno druhá mocnina), což není nic moc.
V tom se moc nevyznám, ale pochopils to spávně. Takže ty říkáš odečítat v php??...právě mě zarazil výsledek rychlosti toho dotazu, že je opravdu rychlý, tak nevím, jestli nebude php pomalejší...je pravda, že v tabulce bude hodně záznamů...
Joker
Profil
V tom se moc nevyznám
Jde o to, že při provádění dotazu SELECT ... FROM tabulka1,tabulka2 ... se v databázi vytvoří nová tabulka, obsahující kartézský součin spojovaných tabulek- všechny kombinace jejich řádků. Z té se pak podle WHERE části dotazu vyberou odpovídající řádky. Počet řádků té spojené tabulky (ze které se vybírá) je součin počtu řádků všech spojovaných tabulek, takže pokud spojuju dvakrát tu samou, tak počet jejích řádků na druhou.
Tj. pokud bude tabulka hraci mít třeba tisíc řádků, vyrobí se napřed tabulka o milionu řádků a z ní se potom vyberou dva záznamy.
U větších tabulek je tohle pekelně pomalé.
Naopak spojení tabulek s párováním řádků podle nějaké podmínky (JOIN... ON...) podle mých měření není o moc pomalejší, než výběr z jediné tabulky.

Btw. možná by šlo: SELECT (h1.obrana - h2.obrana) AS rozdil FROM hraci h1 JOIN hraci h2 ON (h1.idhrace=1 AND h2.idhrace=4)
to by mohlo být rychlejší, než ten původní dotaz, protože místo tabulky o počtu řádků (počet řádků tabulky hraci) na druhou bude spojená tabulka mít jen jeden řádek.
Casero
Profil
Joker
Moc dík za vysvětlení, právě sem si to dočetl v manuálu. ;) A ten tvůj výtvor vypadá dobře. Bohužel, nějak se mi nedaří objektivně změřit rychlost v phpmyadminovi. Většinou to výjde stejně rychle, ale občas je to tvoje logičtější řešení 10x rychlejší.
Joker
Profil
Na to měření je nejlepší si naprogramovat vlastní skript; pak je taky potřeba mít správnou tabulku- zrovna v tomhle případě bude dost záležet na velikosti tabulky.
Při spojení stejné tabulky dvakrát bez nějaké podmínky bude objem dat růst s druhou mocninou počtu řádků té tabulky.
Takže alespoň co jsem já testoval na pokusné tabulce s 50 000 řádky na MySQL 4.0.23 (asi bych měl upgradovat :-) ) tak tam ten rozdíl mezi "SELECT FROM tabulka t1 JOIN tabulka t2 ON t1.id=t2.id WHERE neco" vs. "SELECT FROM tabulka, tabulka WHERE neco" byl řádově desítky milisekund vs. řádově desítky sekund (btw. ta spojená tabulka ve druhém případě měla 2,5 miliardy záznamů).

edit: Ono to samozřejmě záleží, třeba pokud by bylo jisté, že ta daná tabulka nikdy nebude mít víc než nějakých pár desítek řádků, tak je to asi jedno.
Casero
Profil
Joker
Jasný no, tabulka bude mít řádově pár tisíc záznamů a stejně myslím, že nic nezkazím, když ten tvuj dotaz budu lifrovat všude. ;)
Toto téma je uzamčeno. Odpověď nelze zaslat.