Warning: count(): Parameter must be an array or an object that implements Countable in /home/pasokime/domains/mysql.lt/public_html/forumas/include/parser.php on line 820

1 (edited by neworld 2007-08-18 17:20:02)

Topic: pasiulymai optimizuojant

siandien pasijungiu phpmyadmin ir man akys ant kaktos. Viena lentelė su kuria daug darbuojuos turi 31.050 įrašų, užima 1.4MB. Pasirašiau užklausa kad ištrintų nereikalingas eilutes kurių buvo 29. Jos dabartinė struktura tokia:

CREATE TABLE  `nw_build` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `user` int(10) unsigned NOT NULL,
  `planet` int(10) unsigned NOT NULL,
  `metal` smallint(5) unsigned NOT NULL,
  `mineral` smallint(5) unsigned NOT NULL,
  `oil` smallint(5) unsigned NOT NULL,
  `energy` smallint(5) unsigned NOT NULL,
  `metal_build` smallint(4) unsigned NOT NULL,
  `mineral_build` smallint(4) unsigned NOT NULL,
  `oil_build` smallint(4) unsigned NOT NULL,
  `energy_build` smallint(4) unsigned NOT NULL,
  `home` smallint(4) unsigned NOT NULL,
  `place` smallint(4) unsigned NOT NULL,
  `air` smallint(4) unsigned NOT NULL,
  `ground` smallint(4) unsigned NOT NULL,
  `wall` smallint(3) unsigned NOT NULL,
  `barack` tinyint(2) unsigned NOT NULL,
  `robot` tinyint(2) unsigned NOT NULL,
  `tank` tinyint(2) unsigned NOT NULL,
  `fly` tinyint(2) unsigned NOT NULL,
  `army` mediumtext character set latin1 collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `Index_2` (`user`,`planet`)
) ENGINE=MyISAM AUTO_INCREMENT=35210;

visa esmė tame jog vienas vartotojas gali turėti daug planetų, ir viena planeta gali tūrėti daug vartotojų, taigi dažniausiai mano sql sakinių gale buna

WHERE `user`='55' and `planet`='444'

Tiesa dar dažnai atlieku sudėties veiksmus, kažkas panašaus į

SELECT SUM(home) as home FROM nw_build WHERE `user`='55'

Taigi, gal dar kaip nors įmanoma supaprastinti duomenų paiešką, kad ši lentelė kuo mažiau stabdytų (dabar kolkas nestabdo).

įrašai kaupiami geometrine progresija :)

Re: pasiulymai optimizuojant

tau tipo SELECT'as žada stabdyt?
o dėl optimizavimo tai sunku pasakyti, matant tik vieną lentelę. manau apie normalines formas esi skaitęs, o daugiau patart man kompetencija neleidžia :)

3 (edited by neworld 2007-08-19 14:17:43)

Re: pasiulymai optimizuojant

O visa esmė galvoju gal imanoma taip jog indeksuotu iškarto user ir planet poras. Vos tik nurodau user ir planet atitinkamus, jau mysql žino kurį įrašą imti. Nors kai user ir planet dabar yra ant vieno indekso, gal taip ir vyksta.

O šiaip ši lentelė yra cache, tiesiog kiekvienam vartotojui su cache'uoju konkrečiai jo duomenis, gal nebereikėtų šiuos duomenis rankioti pastoviai.

Tiesa pažiūrėjau jog dabar yra Index_2 įrašų skaičius 1940, tačiau indeksas užima daugiau kaip pusę lentelės. Kogero viskas ir veikia taip kaip galvoju.

Re: pasiulymai optimizuojant

Pradžioje reikėtų pradėti skaityti: http://dev.mysql.com/doc/refman/4.1/en/ … ation.html ir šiek tiek SQL'o teorijos (ryšiai, normalizavimas, denormalizavimas, view'sai, etc).

Kaip veikia ir kas kur stabdo užklausose galima sužinoti su EXPLAIN komanda (beje apie ją yra parašyta nuorodoje, kur daviau).