Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Aq
HV kasutaja
liitunud: 01.01.2003
|
29.01.2015 16:36:00
Abi MySQL päringu optimeerimisel |
|
|
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 |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
29.01.2015 17:10:56
|
|
|
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 |
|
 |
Aq
HV kasutaja
liitunud: 01.01.2003
|
02.02.2015 11:48:51
|
|
|
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 |
|
 |
rlv
HV kasutaja

liitunud: 13.08.2003
|
02.02.2015 13:16:16
|
|
|
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 |
|
 |
Aq
HV kasutaja
liitunud: 01.01.2003
|
02.02.2015 16:00:34
|
|
|
Super, tänud! Sain rlv vihje näite abil ehitada päringu, mis on ülikiire
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
rlv
HV kasutaja

liitunud: 13.08.2003
|
02.02.2015 16:02:46
|
|
|
No siis on mul ka hea meel, et sain abiks olla!
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
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
|
|