<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: MySQL &#8211; NULL polja i sortiranje</title>
	<atom:link href="http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/</link>
	<description>Dinke&#039;s Personal Blog</description>
	<lastBuildDate>Mon, 30 Jan 2012 19:52:11 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Srdjevic</title>
		<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/comment-page-1/#comment-59992</link>
		<dc:creator>Srdjevic</dc:creator>
		<pubDate>Thu, 08 Oct 2009 10:08:10 +0000</pubDate>
		<guid isPermaLink="false">http://www.dinke.net/blog/?p=551#comment-59992</guid>
		<description>Ispravka: tek sad primetih da si imao limit tamo na stotku, a pre toga count bez uslova.... tako je to u 5am... :D

Sve u svemu, ono WHERE available != &#039;yes&#039; ne stoji, već koji god uslov da daje _veći_ broj redova, a mysql hoće index prema polju iz uslova zbog kardinaliteta.... pa piše po file systemu gomilu podataka da bi posle sortirao. :)</description>
		<content:encoded><![CDATA[<p>Ispravka: tek sad primetih da si imao limit tamo na stotku, a pre toga count bez uslova&#8230;. tako je to u 5am&#8230; :D</p>
<p>Sve u svemu, ono WHERE available != &#8216;yes&#8217; ne stoji, već koji god uslov da daje _veći_ broj redova, a mysql hoće index prema polju iz uslova zbog kardinaliteta&#8230;. pa piše po file systemu gomilu podataka da bi posle sortirao. :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Srdjevic</title>
		<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/comment-page-1/#comment-59991</link>
		<dc:creator>Srdjevic</dc:creator>
		<pubDate>Thu, 08 Oct 2009 09:41:41 +0000</pubDate>
		<guid isPermaLink="false">http://www.dinke.net/blog/?p=551#comment-59991</guid>
		<description>Da, jasno... Kod mene je bila obrnuta situacija, te mi je upit vadio veliki broj redova... To bi kod tebe bilo nešto tipa WHERE available != &#039;yes&#039;...

Mada, nije to veliki broj redova, sigurno ti je mysql server dovoljno dobro podešen (dovoljno memorije za cache) da može da obavi to sve bez ikakvih problema... U mom &quot;problemu&quot; lik je pravio export od par miliona redova, sa cirka par desetina kolona...i naravno, bilo je i JOIN-a... :)))
Explain, je, naravno, rekao da radi file system sort, i to ga ubivalo... Ma bio je krš shared server, jer sam navikao već da mi dolaze svakakvi likovi sa raznoraznim kombinacijama, pa se nekad previše bavim time da radi svima/svugde kako treba... :D

Sve u svemu, softver se preporodio dodavanjem FORCE INDEX varijante za polja za sortiranje...ali za to ne smeju funkcije. To je sve što je pisac hteo da kaže. :)

M</description>
		<content:encoded><![CDATA[<p>Da, jasno&#8230; Kod mene je bila obrnuta situacija, te mi je upit vadio veliki broj redova&#8230; To bi kod tebe bilo nešto tipa WHERE available != &#8216;yes&#8217;&#8230;</p>
<p>Mada, nije to veliki broj redova, sigurno ti je mysql server dovoljno dobro podešen (dovoljno memorije za cache) da može da obavi to sve bez ikakvih problema&#8230; U mom &#8220;problemu&#8221; lik je pravio export od par miliona redova, sa cirka par desetina kolona&#8230;i naravno, bilo je i JOIN-a&#8230; :)))<br />
Explain, je, naravno, rekao da radi file system sort, i to ga ubivalo&#8230; Ma bio je krš shared server, jer sam navikao već da mi dolaze svakakvi likovi sa raznoraznim kombinacijama, pa se nekad previše bavim time da radi svima/svugde kako treba&#8230; :D</p>
<p>Sve u svemu, softver se preporodio dodavanjem FORCE INDEX varijante za polja za sortiranje&#8230;ali za to ne smeju funkcije. To je sve što je pisac hteo da kaže. :)</p>
<p>M</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dinke</title>
		<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/comment-page-1/#comment-59989</link>
		<dc:creator>dinke</dc:creator>
		<pubDate>Thu, 08 Oct 2009 07:41:11 +0000</pubDate>
		<guid isPermaLink="false">http://www.dinke.net/blog/?p=551#comment-59989</guid>
		<description>^Pazi ovde i nije bilo price o optimizaciji vec o resenju jednostavnog problema koji ja cesto imam kod prikaza podataka iz tabela u nekom frontendu, gde jednostavno ne zelim da mi se slogovi sa null vrednostima pojavljuju na pocetku bez obzira na tip sortiranja (klik na header tabele koji sortira podatke u njoj). Sve sto si rekao stoji, resenje nije optimalno u smislu performansi i svakako da bi kod nekih velikih sajtova sa ko zna kakvim trafikom moralo da se traga za optimalnijim (u smislu brzine izvrsavanja kverija) ali iz licnog iskustva opet kazem da odlicno radi u praksi za ono za sta je namenjeno :)

Sto se performanski tice, evo jedne tabele sa mog servera:

mysql&gt; select count(*) from za_domains_expiring;
+----------+
&#124; count(*) &#124;
+----------+
&#124;   269913 &#124; 
+----------+
1 row in set (0.00 sec)


mysql&gt; select domain from  za_domains_expiring where available=&#039;yes&#039; order by isnull(last_update), last_update desc limit 0, 100;
+---------------------------+
&#124; domain                    &#124;
+---------------------------+
...
+---------------------------+
100 rows in set (0.56 sec)

mysql&gt; explain select domain from  za_domains_expiring where available=&#039;yes&#039; order by isnull(last_update), last_update desc limit 0, 100;
+----+-------------+---------------------+------+---------------+-----------+---------+-------+--------+-----------------------------+
&#124; id &#124; select_type &#124; table               &#124; type &#124; possible_keys &#124; key       &#124; key_len &#124; ref   &#124; rows   &#124; Extra                       &#124;
+----+-------------+---------------------+------+---------------+-----------+---------+-------+--------+-----------------------------+
&#124;  1 &#124; SIMPLE      &#124; za_domains_expiring &#124; ref  &#124; available     &#124; available &#124; 2       &#124; const &#124; 166889 &#124; Using where; Using filesort &#124; 
+----+-------------+---------------------+------+---------------+-----------+---------+-------+--------+-----------------------------+
1 row in set (0.00 sec)

mysql&gt; 

Dakle 0.56 sec iko koristi filesort za prikaz, ali ne znam ... mozda je ovaj server zver pa to ide ovako brzo ;)

Jos jednom hvala za komentar, izvini ako je izgledalo da imam neki odbrambeni stav, jednostavno sa tvoje strane meni je zvucalo kao da nipodastavas pomenuto resenje bez da si dao predlog boljeg (sto bih iskreno i ja voleo da vidim, naucim nesto novo itd.) :)

Poz</description>
		<content:encoded><![CDATA[<p>^Pazi ovde i nije bilo price o optimizaciji vec o resenju jednostavnog problema koji ja cesto imam kod prikaza podataka iz tabela u nekom frontendu, gde jednostavno ne zelim da mi se slogovi sa null vrednostima pojavljuju na pocetku bez obzira na tip sortiranja (klik na header tabele koji sortira podatke u njoj). Sve sto si rekao stoji, resenje nije optimalno u smislu performansi i svakako da bi kod nekih velikih sajtova sa ko zna kakvim trafikom moralo da se traga za optimalnijim (u smislu brzine izvrsavanja kverija) ali iz licnog iskustva opet kazem da odlicno radi u praksi za ono za sta je namenjeno :)</p>
<p>Sto se performanski tice, evo jedne tabele sa mog servera:</p>
<p>mysql> select count(*) from za_domains_expiring;<br />
+&#8212;&#8212;&#8212;-+<br />
| count(*) |<br />
+&#8212;&#8212;&#8212;-+<br />
|   269913 |<br />
+&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)</p>
<p>mysql> select domain from  za_domains_expiring where available=&#8217;yes&#8217; order by isnull(last_update), last_update desc limit 0, 100;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| domain                    |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
&#8230;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
100 rows in set (0.56 sec)</p>
<p>mysql> explain select domain from  za_domains_expiring where available=&#8217;yes&#8217; order by isnull(last_update), last_update desc limit 0, 100;<br />
+&#8212;-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| id | select_type | table               | type | possible_keys | key       | key_len | ref   | rows   | Extra                       |<br />
+&#8212;-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
|  1 | SIMPLE      | za_domains_expiring | ref  | available     | available | 2       | const | 166889 | Using where; Using filesort |<br />
+&#8212;-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;-+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
1 row in set (0.00 sec)</p>
<p>mysql> </p>
<p>Dakle 0.56 sec iko koristi filesort za prikaz, ali ne znam &#8230; mozda je ovaj server zver pa to ide ovako brzo ;)</p>
<p>Jos jednom hvala za komentar, izvini ako je izgledalo da imam neki odbrambeni stav, jednostavno sa tvoje strane meni je zvucalo kao da nipodastavas pomenuto resenje bez da si dao predlog boljeg (sto bih iskreno i ja voleo da vidim, naucim nesto novo itd.) :)</p>
<p>Poz</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Srdjevic</title>
		<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/comment-page-1/#comment-59987</link>
		<dc:creator>Srdjevic</dc:creator>
		<pubDate>Thu, 08 Oct 2009 07:14:39 +0000</pubDate>
		<guid isPermaLink="false">http://www.dinke.net/blog/?p=551#comment-59987</guid>
		<description>Pa poenta i jeste da nema &quot;širokog&quot; rešenja, usklađujes rešenje problemu. Samo htedoh da napomenem radi kompletnosti da ovo nekad i nije najsretnije rešenje. Naleteh slučajno na text na DPT-u, pa kako sam se bavio ovim problemom pre nepunih mesec dana, rekoh ajd&#039; da dodam.

Skoro sam uvodio baš to polje, jer je upit za export u CSV contact book-a od par miliona redi (newsletter) radio upravo to: negde obarao server, negde ga vukao satima.

Recimo, običan upit tipa:
SELECT * FROM contacts WHERE active = 1 ORDER BY  ISNULL(sdate), sdate
MySQL nekad iskoristi index za active, a onda par miliona redova (sa đumlom kolona) počne da sortira... kad opališ EXPLAIN, vidiš da im koristi temp za sortiranje, pa to ubija. :(

Vidim da si zauzeo malo odbramben stav, a upravo si ti dao &quot;šire&quot; (da ga tako nazovemo) rešenje. :) Ja samo htedoh dodati da je ono naizgled ružnije više skalabilno, ništa više.

Još jedan konstruktivan savet: u ovakvim člancima lepo je navesti i output EXPLAIN-a.

Svakako je dobar članak! Sada je, nadam se, još bolji. ;)

Svako dobro,
Miloš</description>
		<content:encoded><![CDATA[<p>Pa poenta i jeste da nema &#8220;širokog&#8221; rešenja, usklađujes rešenje problemu. Samo htedoh da napomenem radi kompletnosti da ovo nekad i nije najsretnije rešenje. Naleteh slučajno na text na DPT-u, pa kako sam se bavio ovim problemom pre nepunih mesec dana, rekoh ajd&#8217; da dodam.</p>
<p>Skoro sam uvodio baš to polje, jer je upit za export u CSV contact book-a od par miliona redi (newsletter) radio upravo to: negde obarao server, negde ga vukao satima.</p>
<p>Recimo, običan upit tipa:<br />
SELECT * FROM contacts WHERE active = 1 ORDER BY  ISNULL(sdate), sdate<br />
MySQL nekad iskoristi index za active, a onda par miliona redova (sa đumlom kolona) počne da sortira&#8230; kad opališ EXPLAIN, vidiš da im koristi temp za sortiranje, pa to ubija. :(</p>
<p>Vidim da si zauzeo malo odbramben stav, a upravo si ti dao &#8220;šire&#8221; (da ga tako nazovemo) rešenje. :) Ja samo htedoh dodati da je ono naizgled ružnije više skalabilno, ništa više.</p>
<p>Još jedan konstruktivan savet: u ovakvim člancima lepo je navesti i output EXPLAIN-a.</p>
<p>Svakako je dobar članak! Sada je, nadam se, još bolji. ;)</p>
<p>Svako dobro,<br />
Miloš</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dinke</title>
		<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/comment-page-1/#comment-59986</link>
		<dc:creator>dinke</dc:creator>
		<pubDate>Thu, 08 Oct 2009 06:31:41 +0000</pubDate>
		<guid isPermaLink="false">http://www.dinke.net/blog/?p=551#comment-59986</guid>
		<description>@Srdjevic Ova prica je naravno isprobana u praksi na tabelama sa domenima (tipa od 200k - n miliona domena) i radi sasvim ok bez obrzira na realne probleme sa indexom koje spominjes. U slucaju da je to zaista neophodno moglo bi se praviti jos jedno polje kao sto sam i naveo u primeru (nullorder) mada bi i tu bio problem zbog lose kardinalnosti, sto ce reci cak i sa indexom ne bi bilo nekih poboljsanja.

Inace ako mislis da je ovo &quot;usko&quot; resenje, daj da vidimo to tvoje &quot;siroko&quot; :)</description>
		<content:encoded><![CDATA[<p>@Srdjevic Ova prica je naravno isprobana u praksi na tabelama sa domenima (tipa od 200k &#8211; n miliona domena) i radi sasvim ok bez obrzira na realne probleme sa indexom koje spominjes. U slucaju da je to zaista neophodno moglo bi se praviti jos jedno polje kao sto sam i naveo u primeru (nullorder) mada bi i tu bio problem zbog lose kardinalnosti, sto ce reci cak i sa indexom ne bi bilo nekih poboljsanja.</p>
<p>Inace ako mislis da je ovo &#8220;usko&#8221; resenje, daj da vidimo to tvoje &#8220;siroko&#8221; :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Srdjevic</title>
		<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/comment-page-1/#comment-59984</link>
		<dc:creator>Srdjevic</dc:creator>
		<pubDate>Wed, 07 Oct 2009 22:25:51 +0000</pubDate>
		<guid isPermaLink="false">http://www.dinke.net/blog/?p=551#comment-59984</guid>
		<description>hmmm... rekao bih da je ovo prilično usko rešenje, tj može da se primeni samo u nekim slučajevima:
1. na maloj tabeli
2. ako se koriste uslovi (where) koji su indexirani

Ako ova dva uslova nisu zadovoljena, cela priča pada u vodu. Ako nema uslova u WHERE, hteće da koristi index u ORDER-u, ali neće moći jer imaš funkciju. Dakle upit će raditi sporo, što je, složićete se, najbitnije.

U slučaju da upit nema uslove, kao u gorenavedenom slučaju, ne koristi se nikakav index. Dakle, još jedno polje dobro dođe u ovom slučaju, i ja bih definitivno predložio to za neki veći problem. Onda je lakše forsirati index koji ti treba, u slučaju da je specifična situacija takva da hoćeš da koristi index koji se koristi u ORDER a ne u WHERE čak i ako ga imaš. MySQL nekad ume da pogreši tu, ako vraćaš puno redova, pa se desi da iskoristi index da uzme podatke (za where), ali onda sortira po file-sistemu, i zakoči ga svetski ako imaš puno redova. U _tom_ slučaju, upravo hoćeš da ga teraš da radi tablescan da uzme redove, ako ima gomilu redova za sortiranje, e _tu_ mu treba forsirati index. U ovoj priči to sve škripi.

Lepa je ovo priča teorijski, ali praktično je situacija drugačija... :(</description>
		<content:encoded><![CDATA[<p>hmmm&#8230; rekao bih da je ovo prilično usko rešenje, tj može da se primeni samo u nekim slučajevima:<br />
1. na maloj tabeli<br />
2. ako se koriste uslovi (where) koji su indexirani</p>
<p>Ako ova dva uslova nisu zadovoljena, cela priča pada u vodu. Ako nema uslova u WHERE, hteće da koristi index u ORDER-u, ali neće moći jer imaš funkciju. Dakle upit će raditi sporo, što je, složićete se, najbitnije.</p>
<p>U slučaju da upit nema uslove, kao u gorenavedenom slučaju, ne koristi se nikakav index. Dakle, još jedno polje dobro dođe u ovom slučaju, i ja bih definitivno predložio to za neki veći problem. Onda je lakše forsirati index koji ti treba, u slučaju da je specifična situacija takva da hoćeš da koristi index koji se koristi u ORDER a ne u WHERE čak i ako ga imaš. MySQL nekad ume da pogreši tu, ako vraćaš puno redova, pa se desi da iskoristi index da uzme podatke (za where), ali onda sortira po file-sistemu, i zakoči ga svetski ako imaš puno redova. U _tom_ slučaju, upravo hoćeš da ga teraš da radi tablescan da uzme redove, ako ima gomilu redova za sortiranje, e _tu_ mu treba forsirati index. U ovoj priči to sve škripi.</p>
<p>Lepa je ovo priča teorijski, ali praktično je situacija drugačija&#8230; :(</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Milan Cvejic</title>
		<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/comment-page-1/#comment-59951</link>
		<dc:creator>Milan Cvejic</dc:creator>
		<pubDate>Sun, 04 Oct 2009 23:35:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.dinke.net/blog/?p=551#comment-59951</guid>
		<description>hehe, nisam citao ceo post... :) Videh samo krajnji rezultat :)

Svakako je isto resenje, samo sto mySql ima IFNULL funkciju, pa kontam da je verovatno bolje koristiti nju.</description>
		<content:encoded><![CDATA[<p>hehe, nisam citao ceo post&#8230; :) Videh samo krajnji rezultat :)</p>
<p>Svakako je isto resenje, samo sto mySql ima IFNULL funkciju, pa kontam da je verovatno bolje koristiti nju.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dinke</title>
		<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/comment-page-1/#comment-59945</link>
		<dc:creator>dinke</dc:creator>
		<pubDate>Sun, 04 Oct 2009 20:10:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.dinke.net/blog/?p=551#comment-59945</guid>
		<description>Nema potrebe za dodavanjem nove kolone ni kod &quot;if&quot; varijante:

select * from domains
order by if(expire_date is null, 1, 0), expire_date asc;

je sve sto ti treba. 

Ono dodavanje koje sam odradio posle bilo je samo da bih demonstrirao sta se desava sa if-om (kako radi sort). Pouzdano znam da postoje ljudi koji to ne razumeju :)</description>
		<content:encoded><![CDATA[<p>Nema potrebe za dodavanjem nove kolone ni kod &#8220;if&#8221; varijante:</p>
<p>select * from domains<br />
order by if(expire_date is null, 1, 0), expire_date asc;</p>
<p>je sve sto ti treba. </p>
<p>Ono dodavanje koje sam odradio posle bilo je samo da bih demonstrirao sta se desava sa if-om (kako radi sort). Pouzdano znam da postoje ljudi koji to ne razumeju :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Milan Cvejic</title>
		<link>http://www.dinke.net/blog/2009/10/04/mysql-null-polja-i-sortiranje/comment-page-1/#comment-59942</link>
		<dc:creator>Milan Cvejic</dc:creator>
		<pubDate>Sun, 04 Oct 2009 17:00:23 +0000</pubDate>
		<guid isPermaLink="false">http://www.dinke.net/blog/?p=551#comment-59942</guid>
		<description>Mislim da je ovo dosta jednostavnija varijanta za stavljanje 
redova na kraj...


SELECT * FROM domains ORDER BY ISNULL(expire_date), expire_date [ ASC &#124; DESC ]

Samim tim nema potrebe za dodavanjem nove kolone u tabelu.</description>
		<content:encoded><![CDATA[<p>Mislim da je ovo dosta jednostavnija varijanta za stavljanje<br />
redova na kraj&#8230;</p>
<p>SELECT * FROM domains ORDER BY ISNULL(expire_date), expire_date [ ASC | DESC ]</p>
<p>Samim tim nema potrebe za dodavanjem nove kolone u tabelu.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

