Topic: Indexai, indexai, indexai

Su indexais negerai yra tai, kad jie ne visada naudojami, nors tu to labai norėtum :(

Gal žinot tinkamos literatūros, kada yra naudojami, o dar geriau, kada nenaudojami indexai?


Pavyzdys: gražiam puslapiavimui reikia suskaičiuoti, kiek yra rezultatų. Tarkim paiešką vykdom per title (varchar) ir body (longtext).  Taigi cake'as parašo tokią užklausą:

SELECT COUNT(*) AS `count` FROM `items` AS `Item` LEFT JOIN `users` AS `User` ON (`Item`.`user_id` = `User`.`id`) WHERE ((`Item`.`title` LIKE '%faila%') OR (`Item`.`body` LIKE '%faila%'))

kuri su 5k įrašų trunka ~0.25s, su 20k - 1s, kas yra truputi per ilgai :)

Re: Indexai, indexai, indexai

MySQL dokumentacja ir google. Siaip kaip vygdo tavo uzklausas gali pamatyti uzklausos pradzioje parases EXPLAIN, tada pamatysi kokie query kokiuos indeksus naudoja/nenaudoja, kiek randa atitikmenu ir panasiai. Su JOIN'ais patarciau elgtis atidziai ir nenaudoti belekur ir belekaip.

Zodziu pasiskaitysi dokumentacijas, suzinosi kas ir kaip veikia.

P.S. kartais labiau apsimoka daryti duomenu dubliavima, nei viska pasiimineti per JOIN'us, (prie failo irases ir jo savininko id (user_id), gerokai paspartinsi paieska, nes nebereiks selektinti useriu lenteles).

Re: Indexai, indexai, indexai

šiaip vienas iš geresnių šaltinių yra MySQL dokumentacija.

Kur naudojami ar nenaudojami indeksai, gali preliminariai pradėti žiūrėti per EXPLAIN/EXPLAIN EXTENDED komandą.

Bet nepamiršk, kad vykdymo (on-the-fly) metu tokios operacijos kaip LIKE "%zodis%" yra lėtos, nes MySQL'as, kalbant apie paprastus indeksus, indekse laiko ne tekste esančius žodžius, o yra pasidaręs medį iš pačių elementų. Gal tau praverstu FULLTEXT indeksas. Arba turėtum pabandyti pasigaminsi savo indeksą - vienoje papildomoje lentoje saugai visus žodžius iš tekstų, kitoje saugai nuorodas į tuos žodžius ir nuorodas į tekstus, kuriuose yra tie žodžiais, tada paiešką reikės atlikinėti tik tarp žodžių lentos.

Re: Indexai, indexai, indexai

Dokumentacija tai skaitau :) bet ten nelabai triukus aprašinėja.

@Neodan
Tokį dalinį kešavimą tikrai reiks daryti, bet kol kas su ir be join tik ~1-5ms.

@minde
dėl savo indexo, gal irgi teks pabandyti.

Tik va klausimas, iš patirties, kas daugiausia daro įtakos greičiui - eilutės ilgis ar jų kiekis? Suprantu kad viskas įtakoja, bet visko rankom nepratestuosi :(
Nes esmė yra tokia: yra join'inama lentelė 'values' {id, type, vaule} , kurioje dalis įrašų pagal tipus yra labai standartiniai. Jie tarkim, type = atmintis, tai reikšmės bus tik iš {SSD, MMC ir dar kelios}. Kitas atvejis, jei tipas yra koks barkodas, kuris kiekvienu atveju yra skirtingas.
Ar verta vietoj vienos daryti 3 lenteles (items <-> items_values-common <-> values-common ir values-random). Ta prasme, ar dėl sumažėjusio indexo pagreitėjimas kompensuotų papildomą join'ą?