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 2008-03-22 14:09:13)

Topic: Optimizuojam daugybę įrašų turinčią lentelę

Pastebėjau jog į slow_queries sąraša dažnai patenka:

# Query_time: 8  Lock_time: 0  Rows_sent: 0  Rows_examined: 0

SELECT `user`,`atag`,`text` FROM chat ORDER BY id DESC LIMIT 20;

Id yra primary. Kaip matote visada yra įmami paskutiniai 20 įrašų. Gal kaip nors įmanoma priversti mysql skaityti grynai nuo galo (nes jeigu į slow_queries patenka, manau kaskart perein visą lentelę, kadangi turiu žymiai trupnesnių užklausų kurios nepatenka į šitą sąrašą).

Edit: Letenlėje yra ~100.000 įrašų

Re: Optimizuojam daugybę įrašų turinčią lentelę

Parodyk ką mysql'as rašo:

EXPLAIN EXTENDED SELECT `user`,`atag`,`text` FROM chat ORDER BY id DESC LIMIT 20;

.. ir ..

SHOW CREATE TABLE chat;

Re: Optimizuojam daugybę įrašų turinčią lentelę

explainas:

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1     SIMPLE     chat     index     NULL     PRIMARY     4     NULL     10441
CREATE TABLE `chat` (
 `id` int(10) unsigned NOT NULL auto_increment,
 `time` int(10) unsigned NOT NULL,
 `channel` varchar(128) character set utf8 collate utf8_bin NOT NULL,
 `user` varchar(64) character set utf8 collate utf8_bin NOT NULL,
 `atag` varchar(5) character set utf8 collate utf8_bin NOT NULL,
 `text` mediumtext character set utf8 collate utf8_bin NOT NULL,
 PRIMARY KEY  (`id`),
 KEY `channel` (`channel`),
 KEY `atag` (`atag`)
) ENGINE=MyISAM AUTO_INCREMENT=10442 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='chatas'

Dabar kaip matote ineksai yra id, channel ir atag, ir jie atskiri. Nesuprantu, kodėl įvykdžius šią užklausą, loge kuriame yra lėtos užklausos ir užklausos be indeksų gaunu atitinkamus įrašus. Vykdimo laikas: 0, nusiųsta 20 eilučių, nuskenuota irgi 20. Kas nepatiko?

Be to bėdos dingo kai įrašų skaičių iš 100.000 sumažinau iki 10.000, tačiau logas nežmoniškai didėja, kadangi tokių užklausų yra labai daug.

P.S. loge taip pat yra daug panašių dalykų, bet man svarbiausia yra šita užklausa, kitos vykdomos labai retai.

Re: Optimizuojam daugybę įrašų turinčią lentelę

a) pabandyk SELECT'o stulpelių sąraše pridėti ID:

SELECT `id`, `user`,`atag`,`text`
FROM chat
ORDER BY id DESC
LIMIT 20;

b)pabandyk kokiu greičiu veikia traukiant vien tik ID:

SELECT `id`
FROM chat
ORDER BY id DESC
LIMIT 20