Bosna i Hercegovina



#1 01.10.2017-14:27
Avko Offline
Administrator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,766


Subject: Kako smanjiti vrijeme query upita
kada imam 1 x INNER JOIN i 3 x LEFT OUTER JOIN vrijeme za upit je 44.4 sec, Kako to optimizirati?

SELECT tbl_1.datum,
    tbl_2.id_ime,
    tbl_3.broj_1,
    tbl_3.broj_2,
    tbl_4.ime

FROM tbl_4

INNER JOIN tbl_2 ON tbl_4.id=tbl_2.id
LEFT OUTER JOIN tbl_1 ON tbl_4.id=tbl_1.id
LEFT OUTER JOIN tbl_3 ON tbl_4.broj_2=tbl_3.broj_2
LEFT OUTER JOIN tbl_4 ON tbl_3.broj_1=tbl_4.broj_1
WHERE tbl_1.datum>='2017-10-02'
AND tbl_3.datum=tbl_1.datum
ORDER BY tbl_3.datum ASC
LIMIT 0 , 50

nemam primari key jer ga nemogu umitai zbog valjda vrijednosti koje se ponavljaju
Newton laže! Lake padaju brže!
↑  ↓

#2 01.10.2017-15:37
Gjoreski Offline
Super Moderator
Registrovan/a od: 02.02.2009-22:24
Komentari: 1,339


Subject: Re: Kako smanjiti vrijeme query upita
Kod mene dogo traejne upita je bilo zbog to sto nekih polja u tabeli nisu bile indeksirane.
Ja sam pravio qureija sa vise jointa pa su radili brze nego ovo sta si ti naveo.
↑  ↓

#3 01.10.2017-18:22
Avko Offline
Administrator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,766


Subject: Re: Kako smanjiti vrijeme query upita
Mozes, molim te, objasniti razliku index iprimari key. Isto tako miobjasni na koja polja se stavljaindex moze li se na txt i brojevei kako se to radi?
Hvala.
Newton laže! Lake padaju brže!
↑  ↓

#4 01.10.2017-19:38
Gjoreski Offline
Super Moderator
Registrovan/a od: 02.02.2009-22:24
Komentari: 1,339


Subject: Re: Kako smanjiti vrijeme query upita
Svi polja niz koi se vrsi pretraga je dobro da su indeksirani tako guerija rade brze.
Ides u EDIT Table i tamu potrazis gje se dodaje Novi Index.
Dodas novi index das mi naziv i u index Column dodas za koje polje je taj index.
Na jedan index mogu biti vise polja.
Ja praktikijem jedan index jedo polje.

Evo i fotografije.

Prilozi:
Informacije o fajlu: rar  Index MYSQL.rar
Preuzimanja: 12
Veličina: 61.93 KB

↑  ↓

#5 01.10.2017-21:40
Avko Offline
Administrator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,766


Subject: Re: Kako smanjiti vrijeme query upita
Hvala, sutra cu to malo proucavati pa cu se javiti. Nekada davno sam , jos u dos-u, proucavao dbase i foxbase ali davno je to bilo.
Hvala jos jednom.
Newton laže! Lake padaju brže!
↑  ↓

#6 02.10.2017-09:16
Avko Offline
Administrator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,766


Subject: Re: Kako smanjiti vrijeme query upita
sada sa indexima povecalo se na 50.2865 sec
jedino mi jedno polje nije htijelo indeksirati.
Javilo gresku: #1170 - BLOB/TEXT column 'ime' used in key specification without a key length

mozda bi trebalo nekako drugacije upit sloziti.

Ima li veze kojim redosljedom idu ona spajanja? Kada bi ih preslozili dali bi to utjecalo na brzinu upita?
Newton laže! Lake padaju brže!
↑  ↓

#7 02.10.2017-13:06
Gjoreski Offline
Super Moderator
Registrovan/a od: 02.02.2009-22:24
Komentari: 1,339


Subject: Re: Kako smanjiti vrijeme query upita
Daj postavi table pa da pogledamo sta je sta.
Neka bude tabele sa podatcima da mozemo testirati.
↑  ↓

#8 02.10.2017-13:18
Avko Offline
Administrator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,766


Subject: Re: Kako smanjiti vrijeme query upita
jos jedno pitanje i onda cu odustati, najvjerojatnije.

u jednoj tabli mi je tbl_1.broj (txt) a u drugoj tabli mi je tbl_2.broj (int) i kada usporedujem :

INNER JOIN tbl_2 ON tbl_1.broj = tbl_2.broj

da li bi tu mogao biti problem kada se usporeduje INT polje i TXT polje?
Newton laže! Lake padaju brže!
↑  ↓

#9 02.10.2017-13:41
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 9,490


Subject: Re: Kako smanjiti vrijeme query upita
Da moze biti proble u stavri radi sporije.
Jer moras jedno pretvoriti u string ili drugo u broj.
Onako usporedjivanje i nije sigurno.

E sad ovako.
Ukoliko vrsimo pretragu po nekom polju onda je preporucljivo da to polje bude indeksirano sa ima ili nema duplikata.

Treba napomenuti i ovo da racunar brze radi sa stringovime nego sa brojevima.

Ukoliko je ovo gore ispostovano onda neka tabela do milion redova nebi trebala da pretstavlja nikakav problem.
Dalje neznam jer nisam imao priliku imati vise podataka.

Ukoliko radi sporo onda zakaci primjer jer je mozda nesto drugo u pitanju.
Pozdrav
↑  ↓

#10 05.10.2017-11:53
Avko Offline
Administrator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,766


Subject: Re: Kako smanjiti vrijeme query upita
evo rijesio
Trebalo je upotrebljavati "aliase" i dva SELECT-a
pa ajmo pogledati.

Zbog jednostavnosti varijable su var_1, var_2 ... var_7, a table su tabla_1...tabla_5

tabla_1: var_1     var_7
tabla_2: var_1var_2    var_6 
tabla_3:  var_2var_3    
        
tabla_4:   var_3var_4 var_6 
tabla_5:    var_4var_5  
        

Nakon sto napravimo upt na svih 5 tabela zelimo da nam se na ekranu prikazu sljedeci rezultati:
var_1, var_2, var_3, var_5

to cemo dobiti sljedecim:

DownloadIzvorni kod (Text):
  1. //koje varijable u konacnici zelimo vidjeti
  2.  
  3. SELECT tbl_123.var_1, tbl_123.var_2, tbl_45.var_3, tbl_45.var_5


Koristimo aliase, ja sam stekao dojam da ubrzavaju upite. Prvi upit na tabele 1,2 i 3.

kolone koje zelimo vidjeti ili kasnije sa njima raditi odaberemo sa SELECT
DownloadIzvorni kod (Text):
  1. FROM
  2.     (
  3.         SELECT t3.var_3, t1.var_7, t2.var_6

alias tabli dobijemo tabla_1=t1, tabla_2=t2 i tabla_3=t3, varijablama ne dajemo aliase
DownloadIzvorni kod (Text):
  1.         FROM tabla_1 t1
  2.         INNER JOIN tabla_2 t2
  3.                 ON t2.var_1 = t1.var_1
  4.         INNER JOIN tabla_3 t3
  5.                 ON t3.var_2 = t2.var_2
  6.         WHERE t3.var_3 >= '2017-10-01'

rezultatu dajemo alias ime, tbl_123. To je tabla sa nastala od tabli t1,t2 i t3 sa prikazom var_3,var_7 i var_6

DownloadIzvorni kod (Text):
  1.       // alias ime table koja je nastala iz tabli1,2 i3
  2.      ) tbl_123

(tabla_1, tabla_2, tabla_3) INNER (tabla_4, tabla_5)

DownloadIzvorni kod (Text):
  1. // INNER naredba mysql-a koja vrsi presjek
  2. INNER JOIN

sada radimo alias drugu tablu koja je presjek table_4 i table_5
kolone koje zelimo vidjeti nakon INNER-a tabli 4 i 5
DownloadIzvorni kod (Text):
  1.    (
  2.         SELECT t4.var_3, t4.var_6, t5.var_4, t5.var_5
  3.         FROM tabla_4 t4
  4.         INNER JOIN tabla_5 t5
  5.                 ON t5.var_4 = t4.var_4
  6.         WHERE t4.var_3 >= '2017-10-01'

presjeku table 4 i table_5 dajemo alias ime tbl_45

DownloadIzvorni kod (Text):
  1. // nakon presjeka tabli4 i5 dajemo alias ime tbl_45
  2.  ) tbl_45

uvijet za (tabla_1, tabla_2, tabla_3) INNER (tabla_4, tabla_5)
DownloadIzvorni kod (Text):
  1. //uvijet za presjek alias tabli
  2.  ON tbl_123.var_3 = tbl45.var_3 AND tbl_123.var_6 = tbl_45.var_6

i to je to 0,07 sec a prije min 44 sec

evo sada cijeli kod skupa:
DownloadIzvorni kod (Text):
  1. SELECT tbl_123.var_1, tbl_123.var_2, tbl_45.var_3, tbl_45.var_5
  2. FROM
  3.     (
  4.         SELECT t3.var_3, t1.var_7, t2.var_6
  5.         FROM tabla_1 t1
  6.         INNER JOIN tabla_2 t2
  7.                 ON t2.var_1 = t1.var_1
  8.         INNER JOIN tabla_3 t3
  9.                 ON t3.var_2 = t2.var_2
  10.         WHERE t3.var_3 >= '2017-10-01'
  11.      ) tbl_123
  12.  
  13. INNER JOIN
  14.  
  15.      (
  16.         SELECT t4.var_3, t4.var_6, t5.var_4, t5.var_5
  17.         FROM tabla_4 t4
  18.         INNER JOIN tabla_5 t5
  19.                 ON t5.var_4 = t4.var_4
  20.         WHERE t4.var_3 >= '2017-10-01'
  21.      ) tbl_45
  22.   ON tbl_123.var_3 = tbl45.var_3 AND tbl_123.var_6 = tbl_45.var_6

Newton laže! Lake padaju brže!
Ovaj komentar je mijenjan 1 puta. zadnja izmjena 05.10.2017-12:01 od strane Avko. ↑  ↓

#11 05.10.2017-13:09
Gjoreski Offline
Super Moderator
Registrovan/a od: 02.02.2009-22:24
Komentari: 1,339


Subject: Re: Kako smanjiti vrijeme query upita
Ovo se naziva select u select i ja ga cesto koristim kad trebam uraditi nekih pokmpleksnih Querija ili preracuna.
Ja ovo vise puta sam na MS SQL nisam na MY SQL ali vidim da je skoro identicno .
↑  ↓

Stranice (1): 1


All times are GMT +01:00. Current time: 24.11.2017-13:59.