Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Abi MySQL päringu optimeerimisel märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Aq
HV kasutaja

liitunud: 01.01.2003




sõnum 29.01.2015 16:36:00 Abi MySQL päringu optimeerimisel vasta tsitaadiga

Mure selline. On MySQL päring, millega on soov lugeda andmetabelis kokku mingid värtused ja seejärel teha nende baasil tehteid nii, et tulemuseks oleks tehte tulemus. See on vaja saavutada SQLis - ei saa jätta arvutamist PHP teha, sest on soov tulemuse järgi ka reastada.

Praegune väga ebaoptimaalne kood on selline:
SELECT
andmetabel.pealkiri AS pealkiri,
(SELECT COUNT(lisatabel.mingivali) FROM lisatabel WHERE /SIIA MINGI TINGIMUS/) AS tegur1,
(SELECT COUNT(lisatabel.mingivali) FROM lisatabel WHERE /SIIA MINGI TINGIMUS/) AS tegur2,
(SELECT (tegur1*tegur2)) AS tulemus
FROM andmetabel AS andmetabel ORDER BY tulemus ASC

Tean, et päring on aeglane alampäringute tõttu. Internetis otsides olen aru saanud, et onolemas meetod, kuidas JOIN abil saavutada sama tulemus ja see olevat väidetavalt palju optimaalsem, aga - miskipärast ei ole leidnud näiteid - kuidas saavutada sama tulemus JOIN'ide abil?
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
infidel
HV kasutaja
infidel

liitunud: 31.01.2004




sõnum 29.01.2015 17:10:56 vasta tsitaadiga

Antud päringu puhul on selle JOINiga realiseerimine suhteliselt kohmakas (kuna lisatabelit päritakse kaks korda erinevate tingimustega) ja sõltub paljuski sellest, kuidas on omavahel seotud andmetabel ja lisatabel ning milles seisnevad tingimused. Küll oleks aga abi vastavate väljade indekseerimisest - milliste täpselt, seda peaks kätte juhatama EXPLAIN käsk.
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
Aq
HV kasutaja

liitunud: 01.01.2003




sõnum 02.02.2015 11:48:51 vasta tsitaadiga

Kurb lugu siis... Ma mõtlen siis hoopis selles suunas, et teha mingi "vahetabel", et iga kord ei oleks kogu kupatuse uut arvutamist...
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
rlv
HV kasutaja
rlv

liitunud: 13.08.2003




sõnum 02.02.2015 13:16:16 vasta tsitaadiga

Korrutamine on üsna odav tehe, selleks ei ole mõtet vahetabelit teha.

Nii üldiselt on raske mingeid põhimõtteid tuua, aga alampäring võiks olla hoopis
SELECT voti, (voti2...),
sum(case when tingimus1 then 1 else 0 end) as tegur1,
sum(case when tingimus2 then 1 else 0 end) as tegur2
FROM lisatabel
WHERE tingimus1 OR tingimus2
GROUP BY voti, (voti2...)

Selle alampäringu seod JOIN lausega võtmete kaudu peatabeli ja -päringuga. Olenevalt vajadustest võib alampäringu WHERE osa ära jätta või sinna tingimusi lisada.
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 22
tagasi üles
vaata kasutaja infot saada privaatsõnum
Aq
HV kasutaja

liitunud: 01.01.2003




sõnum 02.02.2015 16:00:34 vasta tsitaadiga

Super, tänud! Sain rlv vihje näite abil ehitada päringu, mis on ülikiire icon_smile.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
rlv
HV kasutaja
rlv

liitunud: 13.08.2003




sõnum 02.02.2015 16:02:46 vasta tsitaadiga

No siis on mul ka hea meel, et sain abiks olla!
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 22
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Abi MySQL päringu optimeerimisel
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.