MySQL - Dolgi query ali več manjših?
 
G-force4. jan 2010 18:04:52Pridružen od:
31. mar 2008
719 objav
+336-451
#1Zanima me ali se je boljše potruditi in narediti en "dolgi" query v katerem uporabiš JOIN-e ali je vseeno in pač narediš več manjših, ko kakšen podatek potrebuješ? Predvsem me zanima z vidika hitrosti (za končnega uporabnika) in obremenitve (za strežnik)?
všeč(0)ni všeč(0)spam(0)
 
phpseo4. jan 2010 19:34:27Pridružen od:
24. nov 2007
95 objav
+41-90
#2Verjetno en velik, ker se znebiš povezovanja z mysql-om.
všeč(0)ni všeč(-1)spam(0)
 
schtr4jh4. jan 2010 19:46:39Pridružen od:
24. nov 2008
331 objav
+245-224
#3V primeru, da uporabljaš join, si poglej tale primer:

Povezuješ 3 tabele (recimo x, y in z). V x tabeli imaš 1000 zapisov, v y tabeli imaš 5000 zapisov, v z tabeli imaš 500 zapisov. Join najprej dejansko primerja vsakega z vsakim in dobiš 2.500.000.000 vrstic (1000*5000*500). To so zaenkrat še nekakovostni podatki. Šele nato pa se izvede "on" del stavka ( ... join _on_ x.id_x = y.id_x) ter recimo dobiš 2.500 vrstic s pravimi podatki. (kar pomeni, da mora baza pogledat pri vsaki vrstici ali se "on" del stavka ujema: Razmerje podatkov v tem primeru je 1:1.000.000=kakovostni:nekakovostni).
+ 1 kompleksen sql stavek
- ogromno dela za procesor in podatkovno bazo

Če narediš več manjših:
+ manj dela za procesor in podatkovno bazo
- več sql stavkov (za vsako bazi pošlješ sql stavek, baza ga obdela, ga vrne nazaj, na vrsti je drug stavek itd.)

Na kratko: za delo z večjo količino podatkov je join počasnejši in bolj obremeni mašino.

Se motim?
všeč(+1)ni všeč(-1)spam(0)
portfolio × Pridobite kvalitetno izobrazbo za vozniški izpit v šoli vožnje / avtošoli Relax × Iščete avtobusni prevoz ali prevoz blaga? Preverite v Relax Trans d.o.o.
 
Roky4. jan 2010 19:47:38Pridružen od:
9. apr 2008
1879 objav
+1475-17783
#4Ja odvisno kako dolg je ta query, če je res 150 joinov potem je res bolje, da delaš posamezne selecte, če pa imaš le par joinov pol pa je povezovanje, kopiranje podatkov (iz mysql v mysql driver (pred php 5.3)) za vsak select posebej pomoje počasnejše.

Zadeva torej zavisi od količine podatkov.
nazadnje urejal Roky 4. jan 2010 19:48:50
všeč(0)ni všeč(0)spam(0)
 
Vini4. jan 2010 21:05:37Pridružen od:
1. sep 2006
6102 objavi
+3395-31537
#5schtr4jh, kakšne neumnosti pa govoriš, madona? Še nikoli nisi slišal za indekse? :)

G-force, načeloma bi moral biti en query hitrejši že zaradi tega, ker imata query parser in query optimizer delo le enkrat. Kaj točno je pa v tvojem primeru hitrejše, pa rajši stestiraj :) Če pa res potrebuješ veliko količino manjših (enakih) queryjev, si pa oglej prepared statements.
všeč(+3)ni všeč(0)spam(0)
 
suprpp4. jan 2010 21:28:35Pridružen od:
21. jun 2008
144 objav
+194-122
#6Sicer z SQL že dolgo nisem delal, sem pa slišal ravno zadnjič eno anekdoto, ki ti bo mogoče odgovorila.

V eni večji spletni banki so imeli grozen problem s počasnim queryem, ki se je izvajal 20+ sekund; nesprejemljivo. In to na grozno hitrih mašinah - gre se za okolje kjer denarnih omejitev ni.
No, najeli so enega DB admina, ki jim je v nekaj uricah poslal nazaj ostudno dolg SQL stavek, ki je vrnil željeni rezultat v 20ms :)
:)

ps. šlo se je pa za MS SQL.
nazadnje urejal suprpp 4. jan 2010 21:34:17
všeč(+2)ni všeč(0)spam(0)
Spletno gostovanje in domene Neo-Serv
Prijazno gostovanje in ugodne domene.
 
Gogy4. jan 2010 21:41:05Pridružen od:
17. mar 2007
1575 objav
+1118-1718
#7Samo da ne bomo na koncu izvedeli, da gre za bazo s 12 tabelami od katerih bi bil join na 2 tabeli in da nobena nima več kot 500 vrstic v tabeli :) in da je 50 obiskov na dan :)

G-force, da se fantje ne bi matrali... lahko poveš kak podatek več?
všeč(0)ni všeč(0)spam(0)
 
schtr4jh4. jan 2010 22:06:09Pridružen od:
24. nov 2008
331 objav
+245-224
#8
Vini:
schtr4jh, kakšne neumnosti pa govoriš, madona? Še nikoli nisi slišal za indekse? :)

Najverjetneje sem nekaj pojmov pobrklal ampak vseeno se mi dozdeva, da nam je profesor povedal, kaj se zgodi, ko uporabljamo join stavke. Možno, da je zraven rekel, da se to zgodi, če ne uporabljamo indexov. =) (zato sem pa zraven dodal "Se motim?") =)
všeč(0)ni všeč(0)spam(0)
portfolio × Pridobite kvalitetno izobrazbo za vozniški izpit v šoli vožnje / avtošoli Relax × Iščete avtobusni prevoz ali prevoz blaga? Preverite v Relax Trans d.o.o.
 
Vini4. jan 2010 22:33:27Pridružen od:
1. sep 2006
6102 objavi
+3395-31537
#9Se le splača ne sedeti na ušesih na predavanjih, kaj? :)
všeč(0)ni všeč(0)spam(1)
 
carli5. jan 2010 10:12:26Pridružen od:
5. avg 2008
602 objavi
+137-157
#10Dolg SQL stavek? Meja je kaj 22" monitor, preden se vrstica zlomi?

Tak o vprašanju če ti ne gre join, ali je smiselno delat join ali pa enostavno en SQL stavek, kjer izbiraš iz a in b tabele, na podlagi a.id in b.nek_id = a.id iz tabele a in tabele b. Spada ta stavek pod dolge ker ni joina? :D

Primer za zadnji post v phpBB3 v nekem forumu oz. sklopu:SELECT t.topic_id, t.topic_title, t.topic_last_post_id, t.forum_id, p.post_id, p.poster_id, p.post_text, p.post_time, u.user_id, u.username, a.topic_id, a.attach_id
FROM $table_topics t, $table_forums f, $table_posts p, $table_users u, $table_attachments a
WHERE t.topic_id = p.topic_id AND
f.forum_id = t.forum_id AND
t.forum_id = 2 AND
t.topic_status <> 2 AND
p.post_id = t.topic_last_post_id AND
p.poster_id = u.user_id AND
a.topic_id = p.topic_id
ORDER BY p.post_id DESC LIMIT $topicnumber";

Pa stvar dela normalno, pa ni moje stvarjenje, bi se sam verjetno kakega joina lotu, bi bil pa verjetno daljši :D
všeč(0)ni všeč(0)spam(0)
 
stran 1 od 3 |<<123>|