Topic: Uzklausa su innerais

man niekaip nesuveikia uzklausa l.ilgai krauna ja ji atrodo taip

Select * From imones a inner join (imoniu_info b) ON (b.imoniu_id = a.id) Inner join finansai c ON (c.s_id = a.teigiamas)  Inner join finansai c ON (c.s_id = a.neigiamas) WHERE {apibrezimas} group by a.id limit 1

Esme tame kad du inner joinai turi kreiptis i viena ir ta pacia lentele ir is jos paiimti skirtingus duomenis. Pasalinus viena is inner joinu viska gerai ima. o kai 2 iskart nebekrauna. Lenteliu strukturos keisti negaliu. Man tik reikia kad jas paiimtu. L.reikia protingo patarimo. Lauksiu. :)

Re: Uzklausa su innerais

a) kiek duomenų kiekvienoje lentelėje?
b) kokie laukų, per kuriuos daromi sujungimai tipai?
c) ar tie laukai yra bent jau indexai?
d) ką blogo rodo EXPLAIN komanda?

Re: Uzklausa su innerais

imones apie 5 000 k. imoniu info panasiai 3000 k finasnai 500.
Visi kurie sujungiami yra int tipu
taip yra
Explain komadna nesinaudojau kaip aj apsinaudoti? :)

Re: Uzklausa su innerais

Prieš užklausą parašyk žodelį Explain

Re: Uzklausa su innerais

Dabar patvarkiau kraunasi tik uztrunka apie 0.46 sekundes tai jauciu l.daug

explainas
id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra 
1    SIMPLE    a    range    PRIMARY,laikas    laikas    16    NULL    595    Using where; Using temporary; Using filesort
1    SIMPLE    d    ref    imonesid    imonesid    4    db.a.antros_id    1    Using where
1    SIMPLE    b    ref    imonesid    imonesid    4    db.a.id    1     
1    SIMPLE    c    ref    imonesid    imonesid    4    db.a.pirmos_id    1    Using where

Re: Uzklausa su innerais

Jeigu dar nesunku parodyk tiek pačia užklausą, tiek kaip atrodo duomenų struktūra (SHOW CREATE TABLE lentele).

Ta prasme domina galutinė užklausa su pilnom WHERE sąlygom ir reikšmėm.

Re: Uzklausa su innerais

erelis4 wrote:

Dabar patvarkiau kraunasi tik uztrunka apie 0.46 sekundes tai jauciu l.daug

explainas
id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra 
1    SIMPLE    a    range    PRIMARY,laikas    laikas    16    NULL    595    Using where; Using temporary; Using filesort
1    SIMPLE    d    ref    imonesid    imonesid    4    db.a.antros_id    1    Using where
1    SIMPLE    b    ref    imonesid    imonesid    4    db.a.id    1     
1    SIMPLE    c    ref    imonesid    imonesid    4    db.a.pirmos_id    1    Using where

is select_type (SIMPLE) iskart aisku, kad daromas visu lenteliu full table scan, todel ir uztrunka lb ilgai.
jungimai inner ar outer? keista kad optimizatorius pats nesutvarko jej innerai. reikia ziuret pacia uzklausa, pirmiausia isnaudot pirminius raktus jungiant lenteles, jei tai neimanoma kurti indeksus

Re: Uzklausa su innerais

Taip, panašu, kad čia reikalingas indeksas ant laukelio "laikas", bet tiksliau galima būtų pasakyti pamačius duomenų struktūrą ir užklausą.

Re: Uzklausa su innerais

Stai pateikiu duomenis:

Select * From imones a inner join (imoniu_info b) ON (b.imoniu_id = a.id) Inner join finansai c ON (c.s_id = a.teigiamas)  Inner join finansai c ON (c.s_id = a.neigiamas) WHERE a.laikas < '$siandien' AND a.active = '1' AND a.finansai_up = '0' group by a.id limit 1

O ten pateikti visu lenteliu show table uzklausas?

Re: Uzklausa su innerais

Taip reikia visų lentelių, kad matytusi indeksai.

Re: Uzklausa su innerais

gerai stai

CREATE TABLE `imones` (\n  `id` int(11) NOT NULL auto_increment,\n  `pirmos_id` varchar(255) NOT NULL default '',\n  `laikas` datetime NOT NULL default '0000-00-00 00:00:00',\n  `antros_id` varchar(255) NOT NULL default '',\n   `teigiamas` int(11) NOT NULL default '0',\n `neigiamas` int(11) NOT NULL default '0',\n`active` int(11) NOT NULL default '0',\n   `finansai_up` int(11) NOT NULL default '0',\n  PRIMARY KEY  (`id`),\n  KEY `laikas` (`laikas`,`active`,`finansai_up`)\n) ENGINE=MyISAM AUTO_INCREMENT=11272 DEFAULT CHARSET=latin1
CREATE TABLE `imones_info` (\n  `id` int(11) NOT NULL auto_increment,\n  `imones_id` int(11) NOT NULL default '0',\n    `finansai` int(11) NOT NULL default '0',\n  PRIMARY KEY  (`id`),\n  KEY `imonesid` (`imones_id`)\n) ENGINE=MyISAM AUTO_INCREMENT=990 DEFAULT CHARSET=latin1
CREATE TABLE `finansai` (\n  `id` int(11) NOT NULL auto_increment,\n  `s_id` int(11) NOT NULL default '0',\n  `biudzetas` int(11) NOT NULL default '0',\n  `pradinis` int(11) NOT NULL default '0',\n  `atlyginimai` int(11) NOT NULL default '0',\n  PRIMARY KEY  (`id`),\n  KEY `s_id` (`s_id`)\n) ENGINE=MyISAM AUTO_INCREMENT=321 DEFAULT CHARSET=latin1

Re: Uzklausa su innerais

a) Rašei "imones apie 5 000 k. imoniu info panasiai 3000 k finasnai 500", čia tikrai tiek duomenų? 5000k/3000k ar tik 5k/3k? Nes 5000k ir 3000k atitinka 5000000 ir 3000000. Kitaip sakant po 5 ir 3 milijonus įrašų. Turint tiek duomenų, lentelės pradeda "sverti" nuo keliolikos iki kelių šimtų megabaitų - tada jau pradeda daryti aktualu ir serverio nustatymai;

b) Taip pat rašei, kad "Lenteliu strukturos keisti negaliu". Vadinasi negali keisti indeksų, nors mano manymu galima būtų pabandyti uždėti indeksą vien tiktai ant laukelių "laikas", "teigiamas" bei "neigiamas" (beje, kas saugoma laukuose "teigiamas" ir "neigiamas"?

c) Taip pat galima sumažinti ir duomenų užimamą vietą: pas tave visi ID yra INT(11), mano Tavo atveju užtenka visur INT(4) UNSIGNED, o kai kuriais atvejais ir INT(2) UNSIGNED arba INT(3) UNSIGNED, čia aišku reikia įvertinti kiek tiksliai yra duomenų, ir kiek jų planuojama turėti atetyje (duomenų augimas). Kalabnt NE apie ID tipo laukus vėl, kyla klausimų su laukų tipų pertekliniais nustatymais;

d) Pas tave užklausoje yra tokia vieta:

Select * From imones a inner join (imoniu_info b) ON (b.imoniu_id = a.id) ...

Niekur nesimato tokio lauko, kaip "imoniu_id" čia arba klaida užklausoje (turėtų būti "imones_id") arba pateikei netikslius duomenis apie lentelių struktūra bei pačią užklausą.

Re: Uzklausa su innerais

Dabar tik paziurejau ir apkarpiau eilute. Pasirodo per didelis SQL neapibrezent kintamuju l.ilgai ima i atminti per daug uzkrauti reikia. Vien imoniu_info uzema 120mb duomenu o aprasymas apie imone l.dideli ir ilgi tekstai kurie suvaryti i longtext laukelius. Dydi pamazinau su kuriais tikrai intai nebus dideli iki maksimo. Tad dabar apibreziu ka pasiemu ir tu ilgu laukeliu nenurodau ir iskart pakrauna greiciau. :)