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

Topic: Index'sai stabdo???

O buvo taip... Susigeneravau vardų ir pavardžių lentelę:

CREATE TABLE `names` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` varchar(32) CHARACTER SET utf8 COLLATE utf8_lithuanian_ci NOT NULL,
`type` enum('1','2') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1',
`sex` enum('N','F','M') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'N',
`lang` enum('EN','LT') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'EN',
`prior` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `type` (`type`),
KEY `sex` (`sex`),
KEY `lang` (`lang`),
KEY `prior` (`prior`)
) ENGINE=MyISAM AUTO_INCREMENT=88801 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Kurioje yra 90000 įrašų. Taigi paleidau dvi užklausas, kurios davė vienodą rezultatą (nes visi type buvo vieno):

SELECT * FROM `names`  ORDER BY RAND() LIMIT 1  <-- vykde 0.111s
SELECT * FROM `names`  WHERE `type` = 2 ORDER BY RAND() LIMIT 1  <--vykde 0.32s

Tai kodėl paieška su indeksu užtruko dvigubai ilgiau?

Profilis parodė, jog antroje užklausoje:

Copying to tmp table    0.295494

pirmoje šita reikšmė mažesnė tris kartus.

Kadangi šitas dalykas man labai svarbu, gal žinote būtų kaip suoptimizuoti?

2 (edited by zygis 2009-09-30 20:45:03)

Re: Index'sai stabdo???

tai matai kiekvieną eilutę tikrino ar atitinka sąlygą nurodytą prie where

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: Index'sai stabdo???

Kad užklausos davė vienodą rezultatą tai nereiškia, kad jų logika vienoda, nes kas bus jeigu atsiras įrašų su type=1,2,3,..?

Pirmoje užklausoje jokia paieška nevykdoma, pajamamas tik atsitiktini rezultatas.

O antroje tikrinamas tipas, šiaip pažiūrėk ką rodo: EXPLAIN SELECT, nes panašu, kad indeksas nenaudojamas.

4 (edited by neworld 2009-11-14 17:20:57)

Re: Index'sai stabdo???

Zygis: Kiekvienos eilutės tikrinti neturėjo, nes tam ir yra skirti indeksai. Pagal dokumentaciją, ORDER BY RAND() yra labai lėtas didelėse lentelėse, tai mano manimu, mažesnės turėtų būti žymiai spartesnės.

O štai ką rodo explain:

http://www.ipix.lt/images/82178011.png