Centar za edukaciju-BiH



#1 01.10.2017 14:27
Avko Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,807


Predmet: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
zivot je moja domovina.
↑  ↓

#2 01.10.2017 15:37
Gjoreski Van mreze
Administrator
Registrovan od:02.02.2009
Postovi:1,854


Predmet: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 Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,807


Predmet: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.
zivot je moja domovina.
↑  ↓

#4 01.10.2017 19:38
Gjoreski Van mreze
Administrator
Registrovan od:02.02.2009
Postovi:1,854


Predmet: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 tipu datoteke za:rar  Index MYSQL.rar
Preuzimanja:396
Velicina datoteke:61.93 KB

↑  ↓

#5 01.10.2017 21:40
Avko Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,807


Predmet: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.
zivot je moja domovina.
↑  ↓

#6 02.10.2017 09:16
Avko Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,807


Predmet: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?
zivot je moja domovina.
↑  ↓

#7 02.10.2017 13:06
Gjoreski Van mreze
Administrator
Registrovan od:02.02.2009
Postovi:1,854


Predmet: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 Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,807


Predmet: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?
zivot je moja domovina.
↑  ↓

#9 02.10.2017 13:41
zxz Van mreze
Administrator
Registrovan od:03.02.2009
Postovi:10,642


Predmet: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.
Podrska samo putem foruma, jer samo tako i ostali imaju koristi od toga.
↑  ↓

#10 05.10.2017 11:53
Avko Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,807


Predmet: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:

PreuzmiIzvorni kôd (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
PreuzmiIzvorni kôd (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
PreuzmiIzvorni kôd (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

PreuzmiIzvorni kôd (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)

PreuzmiIzvorni kôd (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
PreuzmiIzvorni kôd (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

PreuzmiIzvorni kôd (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)
PreuzmiIzvorni kôd (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:
PreuzmiIzvorni kôd (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

zivot je moja domovina.
Ovaj post je ureden 1 puta. Posljednja izmjena 05.10.2017 12:01 od strane Avko. ↑  ↓

Stranice (2):1,2


Sva vremena su GMT +01:00. Trenutno vrijeme: 12: 40 am.