MYSQL - GROUP BY - Temp tabulka

Programovacie jazyky, rady, poradňa...
Ovecka
Darca
Darca
Používateľov profilový obrázok
Príspevky: 1227
Registrovaný: 25 aug 2005, 0:57

MYSQL - GROUP BY - Temp tabulka

Príspevok od používateľa Ovecka »

Ahojte da sa tento prikaz zapisat tak aby sa neopuzivali temp tabulky ?
v tabulke rub moze byt clanok zaradeny aj dva krat preto ten GROUP BY clanok.clanok_id
Akonahle pouzijem GROUP tak sa pouziju temp tabulky a prikaz sa vykonava enormne dlho :/

tabulka server sa pripaja kvoli overeniu ci existuje alebo nie, popripade ako filter podla premenej z vyhladavania

SELECT
clanok.clanok_id clanok_id,
COUNT(DISTINCT clanok.slovo_id) pocet
FROM clanok
INNER JOIN
server ON server.clanok_id = clanok.clanok_id
INNER JOIN
rub ON rub.clanok_id = clanok.clanok_id
WHERE slovo_id IN (2531,3576)
GROUP BY clanok.clanok_id
HAVING pocet = '2'
ORDER BY clanok.publikovany DESC
LIMIT 0, 20


explain:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE clanok range slovo_id slovo_id 4 NULL 47004 Using where; Using index; Using temporary; Using filesort
1 SIMPLE server ref PRIMARY PRIMARY 4 db.clanok.clanok_id 1 Using index
1 SIMPLE rub ref clanok_id clanok_id 4 db.clanok.clanok_id 1 Using index
masterdead
SysAdmin
SysAdmin
Používateľov profilový obrázok
Príspevky: 1809
Registrovaný: 03 aug 2005, 23:32
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: MYSQL - GROUP BY - Temp tabulka

Príspevok od používateľa masterdead »

ukaz "show create table clanok" a daj sem vystup s pouzitim explain extended
Ovecka
Darca
Darca
Používateľov profilový obrázok
Príspevky: 1227
Registrovaný: 25 aug 2005, 0:57

Re: MYSQL - GROUP BY - Temp tabulka

Príspevok od používateľa Ovecka »

id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE clanok ref slovo_id slovo_id 4 const 2019 100.00 Using where; Using index; Using temporary; Using filesort
1 SIMPLE server ref PRIMARY PRIMARY 4 db.clanok.clanok_id 1 100.00 Using index
1 SIMPLE rub ref clanok_id clanok_id 4 db.clanok.clanok_id 1 100.00 Using index

CREATE TABLE `clanok` (
`slovo_id` int(11) NOT NULL,
`clanok_id` int(11) NOT NULL,
`publikovany` int(10) NOT NULL,
UNIQUE KEY `slovo_id` (`slovo_id`,`clanok_id`,`publikovany`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
masterdead
SysAdmin
SysAdmin
Používateľov profilový obrázok
Príspevky: 1809
Registrovaný: 03 aug 2005, 23:32
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: MYSQL - GROUP BY - Temp tabulka

Príspevok od používateľa masterdead »

v prvom explaine je type range v druhom uz ref na clanok tabulke, menil si nieco?
bud by som ten unikatny kluc otocil, aby bol prvy clanok_id, alebo pridal index aj na clanok id, skus len pridat index

ukaz este pls show table status like 'clanok';
Ovecka
Darca
Darca
Používateľov profilový obrázok
Príspevky: 1227
Registrovaný: 25 aug 2005, 0:57

Re: MYSQL - GROUP BY - Temp tabulka

Príspevok od používateľa Ovecka »

Nemenil som tam nic....

Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
clanok MyISAM 10 Fixed 130857354 13 1701145602 3659174697238527 2947923968 0 NULL 2014-09-26 10:18:22 2014-10-03 13:23:57 NULL utf8_general_ci NULL
masterdead
SysAdmin
SysAdmin
Používateľov profilový obrázok
Príspevky: 1809
Registrovaný: 03 aug 2005, 23:32
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: MYSQL - GROUP BY - Temp tabulka

Príspevok od používateľa masterdead »

tak je divne aby raz ta query mala type range a raz ref.

Zabudol som povedat, na konci show table status a explain pouzivaj pls namiesto ; \G zlepsuje to prehladnost

show table status like 'clanok'\G

Ten index si skusil vytvorit?
Napísať odpoveď