» »

Myslq index ne deluje???

Myslq index ne deluje???

algo ::

Imam bazo...

CREATE TABLE pm (
...
author_id INT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
INDEX (author_id),
INDEX (user_id),
INDEX (author_id, user_id),
PRIMARY KEY (thread_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INDEX (author_id, user_id) - je bolj brezveze

Primer vnosov v tabeli pm...

http://shrani.si/f/H/6r/1v1pZBYu/1.tiff

primer querya --> SELECT COUNT(thread_id) FROM pm WHERE author_id = 2 OR user_id = 2

vendar ko preverim indexe z "EXPLAIN SELECT COUNT(thread_id) FROM pm WHERE author_id = 2 OR user_id = 2" mi išče po vsej tabeli???!! Moral bi pa v konkretnem po samo treh vnosih! Kje je napaka?

 s

s

  • spremenil: algo ()

technolog ::

To da je MySQL mal defekten na čase ve vsak... :)

Probej tole:

SELECT COUNT(thread_id) FROM (SELECT thread_id FROM pm WHERE author_id=2 UNION SELECT thread_id FROM pm WHERE user_id = 2) A


2. Probej tabelo nafilat z vsaj 10K zapisi. Mogoče se zaradi zelo malo zapisov (pod 100) MySQL odloči za table scan.

Zgodovina sprememb…

algo ::

Hvala technolog! Očitno je res fora v tem, da sem imel premalo vnosov ko sem testiral. Zdaj ko sem dodal 15 vnosov pa je začel uporabljati indexe.:) kr neki :P

technolog ::

Pa za OR unga dvojnega kompozitnega indexa ne rabiš.

jype ::

algo> kr neki :P

Daleč od tega. Query optimizer, čeprav je ta od MySQL precej lesen, je precej kompleksna naprava, ki se res potrudi optimizirat poizvedbe. Preberi si več o tem, če želiš vedeti, zakaj se ti je to zgodilo.

algo ::

technolog je izjavil:

Pa za OR unga dvojnega kompozitnega indexa ne rabiš.


Vem ja, samo sm mal na blef probaval kje je napaka. Sm ga drugače že odstranil.

jype je izjavil:

algo> kr neki :P

Daleč od tega. Query optimizer, čeprav je ta od MySQL precej lesen, je precej kompleksna naprava, ki se res potrudi optimizirat poizvedbe. Preberi si več o tem, če želiš vedeti, zakaj se ti je to zgodilo.


Mogoče bom pa res ;) Al mi olajšaš delo pa mi kar poveš? :)

Zgodovina sprememb…

  • spremenil: algo ()

technolog ::

Pri Mysql-u se mi je enkrat zgodilo, da sem zamenjal:

stolpec IN (3,5,6)

v

stolpec=3 OR stolpec=5 OR stolpec=6

Pa sem zmanjšal execution time iz minute pa pol na sekundo.

jype ::

algo> Al mi olajšaš delo pa mi kar poveš?

O tem so napisane precej debele knjige, tako da ti težko razložim vse. Če so tabele majhne je ceneje prebrat cel "page" v spomin in se sprehodit skozi seznam vrstic kot nalagat v spomin najprej indeks, potem pa še enkrat prebrat dejanske podatke.

WarpedGone ::

Pa sem zmanjšal execution time iz minute pa pol na sekundo.

Ja, zopet QO, ki OR 'pravilom' razbije na unije, kjer gre vsaka pa po indexu.
Operator IN praviloma služi kot filter in index nad poljem ne pomaga nič.
Zbogom in hvala za vse ribe

technolog ::

No, seveda.

Ampak SQL je jezik v katerem ti poveš, kaj bi rad iz baze, ne na kakšen način naj se to naredi. Optimizator ti mora to razbit.

WarpedGone ::

No, seveda.
Ampak hudič je kot vedno v detajlih ;)
Zbogom in hvala za vse ribe

mn ::

technolog je izjavil:

No, seveda.

Ampak SQL je jezik v katerem ti poveš, kaj bi rad iz baze, ne na kakšen način naj se to naredi. Optimizator ti mora to razbit.


TRUE, ampak saj to tudi naredi. Če pa želiš hitro je pa malce bolj komplicirano :)

Drugače pa "query plan"-e VEDNO glejte na čim bolj realnih podatkih! V točno tem primeru je namreč optimizer delal točno tako kot mora! Beri, izbral si je najcenejšo rešitev. Tako ali tako bi moral namreč prebrati z diska celoten blok (vse vrstice) in ker je bila v tem enem bloku cela tabela je ceneje prebrati celotno tabelo s štarta. Je pa optimiziranje querijev mala umetnost.

HardFu ::

eno vprasanje,... zakaj dajete tabelam (nekateri celo poljem, v tem primeru je ok) taksna kripticna imena... kaj za vraga pomeni 'pm'? dajte eno pomenljivo ime, da bodo developerji za vami vedeli kaj ste hotli dosezt
http://codeable.io

WarpedGone ::

Tudi v primeru polja ime PM ni OK. Prebavil bi kak ID, kej druzga pa ne.
Idealno ime je med 4 in 10 znaki, intuitivno in ne-zanikano, če je sestavljeno so deli imena povezani s podčrtajem.

In seveda BREZ krilate golazni :|
Zbogom in hvala za vse ribe

technolog ::

Jaz imam vse verbose, camel case (idGames je recimo tuji ključ tabele games, isDeleted, numPlayers). Uporabljam pa ID za primarni ključ vsake tabele.

WarpedGone ::

Case sensitive baza?
Zbogom in hvala za vse ribe

technolog ::

Nima vpliva. Ker nikoli ne bom imel hkrati stopca numPlayers in še enega numplayers.

algo ::

HardFu je izjavil:

eno vprasanje,... zakaj dajete tabelam (nekateri celo poljem, v tem primeru je ok) taksna kripticna imena... kaj za vraga pomeni 'pm'? dajte eno pomenljivo ime, da bodo developerji za vami vedeli kaj ste hotli dosezt


Ime je bilo skrajšano samo za slo-tech ;)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Rewrite URLja (apache)

Oddelek: Izdelava spletišč
8867 (787) levaky
»

SQL seštevanje

Oddelek: Izdelava spletišč
121473 (1257) pizdarija1
»

[php, mysql] sortiranje izpisa iz baze

Oddelek: Izdelava spletišč
262569 (2088) Binji
»

SQL select problemček

Oddelek: Programiranje
71010 (880) darh
»

te slikice za folderje na forumu

Oddelek: Programiranje
111009 (894) lordgreg

Več podobnih tem