Novo u 5.5

MySQL 5.5 donosi neke lepe novine… svratite na sutrasnje predavanje na fonu u okviru kampanje blogeri studentima ako ste zainteresovani :)

odziv je bio super, hvala! nadam se da vas nisam presmorio. par slicki sa prezentacije

b2s tim

b2s tim

amfiteatar

amfiteatar

meljem meljem meljem...

meljem meljem meljem...

keynote kao pdf je dostupan ovde.

A evo ga i na scribd-u
MySQL, What’s New in 5.5

VN:F [1.9.22_1171]
Rating: +10 (from 10 votes)

Ne vredi

Kako su krenule glasine da ce nas Orakle kupiti a kako je (bar meni) odavno poznato da je Orakle potpuno windows-centric firma (iako njihov glavni proizvod najbolje radi na Solarisu, iako poseduju svoju distribuciju Linuxa 100% desktop masina u Oraklu je na windowsu i sve interne aplikacije zahtevaju – windows + internet explorer) resih ja da ponovo oprobam te Windowse da vidim da li je to dospelo na neki nivo da moze da se koristi.

Linux i Windows nisu isto
Ko me poznaje, zna da ja na svim masinama imam Linux. Uglavnom je to neka Fedora i uglavnom ili starija F10 ili novija F13. Jedino na jednom od laptopova ima OSX (bilo bi bas glupo na kmeka staviti Linux :D ) ali taj lap sluzi samo za rad na putu, rad na njemu kao “glavnoj” masini je (kao i na svakom lapu) preveliko smaranje. Ta masina je spominjana vec u prici o kvalitetu novih apple masina. Kako potencijalna kupovina od strane Orakla (u slucaju da ja pristanem da predjem kod njih) znaci da cu morati sve interne alate da teram na Windowsu to bi znacilo da cu ili mnogo vremena u toku dana provoditi u virtualnoj masini (imam par XP i jednu win7 virtuelnu masinu u virtualbox-u i to radi ok) ili da cu desktop masinu prebaciti na Windows. Kako sam vec imao veliko iskustvo sa svim windowsima do XP sp3 za njih znam da nema sanse da mi zadovolje osnovne desktop potrebe, Vistu sam probao par nedelja i zakljucio da je kompletan promasaj te je odluka pala na win7 koji je trcao vec (rc verzija) u virtual boxu i radio prilicno lepo. Taman posto sam kupio i par igrica reko da setujemo na desktop masinu Win7 pa da vidimo kako to tuto kompleto radi, da li moze to da nekako prodje kao desktop.

Intel I7 InsideKako OS naravno placa firma pitao sam sta ima i naravno dobio Windows 7 Ultimate Edition. Instalacija je prosla bezbolno i sve je radilo “iz prve”, instalirana je 64bitna verzija Windowsa 7. I u startu je sve delovalo da radi kako treba. Za detaljnije razumevanje clanka bitno je znati na kakvu je masinu dosao taj Windows. Dakle masina je Intel I7 na 3.2GHz sa 12G najbrzeg rama koji je mogao da se kupi u Beogradu, GigaByte ploca sa Intel HW raidom na sebi koji je terao 4x1T WD BLACK sata diskove u 1+0 raidu + 2 SSD diska u RAID0 kombinaciji. Video sistem cini NVidia GTX295 sa 1xsamsung 1680×1050 + 1xdell 1280×1024. Dakle masina nije za bacanje i Windows bi trebalo da radi tu bez problema. Nista od dodatnog hardware-a (osim misa i tastature) nije zakaceno na tu masinu (stampaci, skereni, faxovi, ruteri … sve je to na lanu nista nije zakaceno direkt) tako da problema sa drajverima nije bilo :).Windows 7

Posle instalacije i setovanja sistema, instaliranja nekih osnovnih alata (Firefox, Thunderbird, Putty, X-Win) prva stavka je bila “microsoft je napravio shadow backup na ovim windozama, to navodno radi kao time machine ma macu a isti mi je spasao cudo podataka, aj da ukljucim to” – PRC, prvi problem, shadow backup ne radi ako na bilo kom disku imate neku particiju koja nije “windoze kompatibilna” ?!?!?!? tako da je zbog postojece linux particije na disku shadow service prijavljivao neku “unknown error” i nije umeo da nastavi. Tu je palo prvo razocaranje, ali resih da nastavim i da koristim ovaj operativni sistem minimum mesec dana pre nego ga kompletno odbacim. Vecina aplikacija je trcala sa druge masine kroz X-Win sa linuxa direktno tako da ovde nije bilo potrebe cak ni za Open Office-om. Vrlo birzo su pale instalacije nekih alata koje koristim redovno za posao i za hobby pa je tu dosao CoCreate (CAD program), Alegro (CAD program), Art Of Illusion (3D modeling tool), NetFabb Professional (STL repair tool), MPLAB + PICC + C18 + C30 (PIC development tools), Win AVR + AVR Studio (ATMEL development tools), MS Visual Studio 2008, ECLIPSE (sa milion plaginova sto za embedded sto za “normalno” programiranje) … a odmah zatim i par originalnih igrica koje su cekale na priliku za instalaciju – Dragons Age, Half Life 2 orange pack .. U prvom trenutku, to je sve delovalo ok. Sve je na masini bilo legalno, nesto open source nesto placeno.. sve bi trebalo da radi ok .. sve je tako i delovalo ali ..

EkserTrebalo je malo vremena ponovo se privici na Windows. Fontovi izgledaju drugacije nego na Linux-u i OSX-u, ikone su drugacije, meniji su na drugim mestima, tastatura se skoro ne koristi – vecina shortcuta ne radi, non stop vam je mis u ruci .. sve sam to nekako prevazisao dok nije krenuo prvi ozbiljan problem da se desava. Malo malo pa iz igre izletim nazad u windoze, nekad se samo masina smrzne a nekad uspe da se oporavi. Onda je to pocelo da se desava i sa flash-om, malo malo pa flash dangne windoze – tj. windoze prijave da je drajver za grafiku “kaput” i da je morao biti resetovan. Ok, lepo od njih sto nisu umrli skroz, ali sta fali mom drajveru za grafiku, ili – sta fali mozda ovoj grafickoj, kostala je ko necija godisnja plata!!! Internet, google, posle 2 dana jurcanja, otprilike stvari stoje tako da 64bitna windoza 7 sa 64bitnim nvidia drajverima kada imate vise od jednog gpu-a (da ovaj 295 je sa 2 procesora na kartici) nvidia drajver oce tako ponekad da puca :( … dobro .. sad da bi proverio celu tu varijantu, prebacim se ja na linux, malerisem graficku max 8h bez promena, vratim se na windoze – dange za 5 minuta … ok, aj da vidimo 16bita Win7 .. nateramo ga nekako da se instalira, drajveri, kuku lele .. radi, jedan dan, dva dana .. sljaka 1/1 .. doduse vidi 2 umesto 12G rama ali radi … Koga sad ja tu da uvatim za gusu, microsoft ili nvidiju. NVidia je napravila ok drajver za linux, eno ga 64bita i radi 1/1, napravili su i ok 32bitni drajver za win7 .. sta je to Microsoft ovoga puta uradio da je NVidia + 64bitni Win7 varijanta postala nepozeljna ne znam, ali bice da sam mogao da kupim 500E jeftiniju graficku i da imam mnogo manje problema :(… To je prvi ekser u kovcegu

ekserSpomenuo sam da se u masini pored “normalnih” diskova nalaze dva SSD diska u stripe-u (beskonacno veliki io troughput :D ), Windows taj disk koristi za neko “ubrzavanje”, nemam pojma kako to tacno radi, nisam se preterano brinuo o tome ali valjda je fora da swap i nekakav cache drzi na tom disku posto je mnogo brz. Sve u svemu, to bi kao trebalo da znaci, u realnom svetu sa 12G od kojih je 3-4 uglavnom uvek prazno nema mnogo znacaja. Na istom tom disku (volumenu) se nalazi i windows temp direktorijum, ie temporary files i sve ostalo “temp” sto na windozi ume da se namesti. Jeli, kad tu vec ima 512G sto da ih ne iskoristim :). Znam da bi bilo lepo staviti sistem na takav disk (jo brzineeeeeeeee) ali obzirom da znam koliko cesto SSD diskovi crkavaju (imam klijenta kome je crklo 4 komada za mesec dana, drugog klijenta kome je za zadnjih 6 meseci crklo 4 komada ..) ja na SSD-ove stavljam “scratch disk” i eventualno ih koristim za razne MySQL Cluster benchmarke. Kako je ovde, kao sto sam rekao, na windozi na tom SSD-u samo TEMP i taj njegov “ubrzavac” nedostatak tog diska ne bi trebao da napravi nikakav problem zar ne? Kako mi je trebao SSD da nesto iztestiram, prebacio sam taj SSD volume na drugu masinu kresno windoze i “puf” iako se sve butovalo “kako treba” gomila stvari se cudno ponasalo, malo malo pa se windows “kocio”, “seckao” … bilo je ocigledno da nije “lako” prihvatio to da mu TEMP drajv nije dostupan (iako je poceo da zvrlja temp fajlove po C:\Windows\temp). Znam da nije “znacajno”, ali mene je ovo vrlo razocaralo…

EkserDa se vratimo korak nazad, masina se nalazi iza firewall-a, na masini se vrte iskljucivo placeni programi, nikakav spyware, mailware, *ware nije na masinu instaliran, na masini je “microsoft security essentials” (ili kako se vec zove taj microsoft antivirus software koji ide uz win7) sa ukljucenim real time ovo ono, ta masina ne ide po torentima, porno sajtovima, ne trazi krekove, fixove .. dakle prilicno offline masina ako iskljucimo gigabajta poslovnom maila u Thunderbirdu i putty-a kojim se izlazi van. Nisam pogasio one smaracke provere windowsa (jesi siguran da oces da ti program uradi ovo i ono).. Jeste u masinu par puta bocnut neki cd, tu i tamo po neki flash disk .. Elem, rekoh korak nazad, onaj SSD volume koji je sisao sa windoze zaboden je u jednu drugu masinu zarad nekog testiranja koje je drugar hteo da izvede, odnesosmo diskove kod njega, zabosmo u njegovu masinu, njegova ploca prepozna raid koji je vec bio kreiram (odusevljenje kod obojice posto su ploce razlicite ali sa istim intelovim chipsetom), butnusmo masinu i EKSER!! Sunce ti poljubim kad je masina krenula da visti i pisti … virus ovaj, mailware onaj, trojan, work kuku lele, crvena blinkcuca slova i brojke i zavijanje iz zvucnika … ja sam ostao zbunjen dok je ortak pao sa stolice od smeha… kroz plac mi je rekao “nije qme windows za tebe”.

linux-windowsI sta ja sada da kazem na to. Svasta mi je na Windowsu smetalo, GUI je lep ali nije logican, start meni je super zamisljen ali je search kroz start meni prestao da radi posle 30tak dana, Ume da vidi svih 12G rama ali nema drajver za graficku sa 2 procesora… preziveo sam i to sto mi jedno 70% aplikacija za windows nisu radile (ni u kakvom kompatibiliti modu, ni sa kakvim permissionima … prosto ne rade), ok verovatno ce sledece godine izaci novije verzije tih aplikacija koje ce raditi ok, ali, mnooogo toga tu ne radi, vidim da je kernel dobar, nije ga lako zabosti, prilicno je otporan… gui je isto lep, doduse fale mu virtualni desktopi, znam da ima za to “add-on” ali probao sam jedan “skup” i jedan “dzaba” i oba su mi usporila masinu 20% i nisu mi dali ni pola od onoga sto imam sa obicnim compizom na linuxu ..
tuxOvaj DELL ekran je 4:3 19″ zato sto imam 4:3 19″ touch screen panel koji stoji na njemu. Ovih par meseci koliko sam koristio Win7 taj panel je skinut posto – win7 prosto ne ume da ga koristi, iako je 3m napravio drajver za win7 to sa windozom prosto ne moze da radi kako treba, ne logicno se ponasa .. “nije to to” … Snimiti PDF na Windowsu je svetogrdje, nijedan program to ne podrzava nativno, Adobe PDF kreator kosta ko bubreg (stvarno nisu normalni), hvala google-u pronasao sam neki free pdf kreator koji je prilicno dobro odradio posao za ovih par meseci, ali u poredjenju sa Linuxom (ili jos gore, sa OSX-om) daleko je to od “prijatnog”. Sve u svemu, posle nekoliko (vise od 3 – delovalo je kao vecnost) meseci rada na Windowsu juce mi je definitivno pukao film i vratio sam se na Linux (fedora13) koji taaaaaaaaaaaako lepo radi, sve je na mestu, sve je logicno, sve funkcionise … i nema virusa.

Stvarno sam probao, “majke mi”, nekoliko meseci, radio svaki dan na windozi, samo na windozi, startovao doduse cesto firefox sa linuxa kroz x-win kako bih zavrsio neke stvari, startovao open office sa linuxa (kroz x-win) i jos gomilu aplikacija koje imam samo na linuxu … provodio vecinu vremena u putty-u, i na sve to, uz svu tu pomoc mojih ostalih masina windows nije uspeo da se zadrzi kao desktop. Ovde se kao desktop vraca Fedora, videcu da li ce Dragon’s Age da radi sa wine-om, ako ne, boze moj sta da se radi… ionako nemam mnogo vremena za igranje… za ostalo, tu je uvek VirtualBox

VN:F [1.9.22_1171]
Rating: +11 (from 15 votes)
September 3, 2010 • Tags: , • Posted in: Razno • 20 Comments

Sortiranje po azbuci (azbuka i mysql)

Као земља са два равноправна писма нисмо баш “стандардни” разним произвођачима програмских пакета са пуном подршком за наш, Српски, језик. Поред “смећа у бази”, врло чест проблем везан за карактер сетове у MySQL-у и Српски језик је

MySQL а и остали РДБМС који имају потпуну подршку за карактер сетове подржава колације. Колација је сет правила који дефинише како се неки карактер сет понаша у одређеном језику. Ту се дефинише:

MySQL долази уз брдо колација за UTF8 карактер сет али ниједна од тих колација не ради посао за Српски језик. На срећу, MySQL дозвољава кориснику да дода своју колацију без рекомпајлирања самог сервера. Екстерне колације се налазе у character_sets_dir директоријуму.

Да би сте додали Српску колацију у MySQL потребно је да у Index.xml фајл у character_sets_dir директоријуму

mysql> show variables like 'character_sets_dir';
+--------------------+-----------------------------------------------------------+
| Variable_name      | Value                                                     |
+--------------------+-----------------------------------------------------------+
| character_sets_dir | /usr/local/mysql-5.5.5-m3-linux2.6-x86_64/share/charsets/ |
+--------------------+-----------------------------------------------------------+

у секцији UTF8 додате нову колацију, дакле испод:

<charset name="utf8">
  <family>Unicode</family>
  <description>UTF-8 Unicode</description>
  <alias>utf-8</alias>
  <collation name="utf8_general_ci"	id="33">
   <flag>primary</flag>
   <flag>compiled</flag>
  </collation>
  <collation name="utf8_bin"		id="83">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
</charset>

додате:

 <collation name="utf8_serbian_ci" id="1200">
  <rules>
    <reset>\u0410</reset> 
      <i>A</i> 
      <i>a</i> 
    <reset>\u0411</reset> 
      <i>B</i> 
      <i>b</i> 
    <reset>\u0412</reset> 
      <i>V</i> 
      <i>v</i> 
    <reset>\u0413</reset> 
      <i>G</i> 
      <i>g</i> 
    <reset>\u0414</reset> 
      <i>D</i> 
      <i>d</i> 
    <reset>\u0402</reset> 
      <i>\u0110</i>
      <i>\u0111</i> 
      <i>\u0189</i> 
      <i>Dj</i>
      <i>DJ</i>
      <i>dj</i>
    <reset>\u0415</reset> 
      <i>E</i> 
      <i>e</i> 
    <reset>\u0416</reset> 
      <i>\u017D</i> 
      <i>\u017E</i> 
    <reset>\u0417</reset> 
      <i>Z</i> 
      <i>z</i> 
    <reset>\u0418</reset> 
      <i>\u0419</i> 
      <i>\u0439</i> 
      <i>I</i> 
      <i>i</i> 
    <reset>\u0408</reset> 
      <i>J</i> 
      <i>j</i> 
    <reset>\u041A</reset> 
      <i>K</i> 
      <i>k</i> 
    <reset>\u041B</reset> 
      <i>L</i> 
      <i>l</i> 
    <reset>\u0409</reset> 
      <i>\u01C7</i> 
      <i>\u01C8</i> 
      <i>\u01C9</i> 
      <i>Lj</i>
      <i>LJ</i>
      <i>lj</i>
    <reset>\u041C</reset> 
      <i>M</i> 
      <i>m</i> 
    <reset>\u041D</reset> 
      <i>N</i> 
      <i>n</i>
    <reset>\u040A</reset> 
      <i>\u01CA</i>
      <i>\u01CB</i> 
      <i>\u01CC</i>
      <i>Nj</i>
      <i>NJ</i>
      <i>nj</i>
    <reset>\u041E</reset> 
      <i>O</i> 
      <i>o</i> 
    <reset>\u041F</reset> 
      <i>P</i> 
      <i>p</i> 
    <reset>\u0420</reset> 
      <i>R</i> 
      <i>r</i> 
    <reset>\u0421</reset> 
      <i>S</i> 
      <i>s</i> 
    <reset>\u0422</reset>
      <i>T</i> 
      <i>t</i> 
    <reset>\u040B</reset> 
      <i>\u0106</i> 
      <i>\u0107</i> 
    <reset>\u0423</reset>
      <i>U</i>
      <i>u</i> 
    <reset>\u0424</reset> 
      <i>F</i> 
      <i>f</i> 
    <reset>\u0425</reset> 
      <i>H</i>
      <i>h</i> 
    <reset>\u0426</reset> 
      <i>C</i> 
      <i>c</i> 
    <reset>\u0427</reset> 
      <i>\u010C</i> 
      <i>\u010D</i> 
    <reset>\u040F</reset>
      <i>\u045F</i> 
      <i>\u01C4</i> 
      <i>\u01C5</i>
      <i>\u01C6</i> 
      <i>Dz</i>
      <i>DZ</i>
      <i>dz</i>
    <reset>\u0428</reset> 
      <i>\u0448</i> 
      <i>\u0160</i> 
      <i>\u0161</i> 
  </rules>
  </collation>

рестартујте MySQL сервер и воила, имате нову колацију:

mysql> show collation like '%serbian%';
+-----------------+---------+------+---------+----------+---------+
| Collation       | Charset | Id   | Default | Compiled | Sortlen |
+-----------------+---------+------+---------+----------+---------+
| utf8_serbian_ci | utf8    | 1200 |         |          |       8 |
+-----------------+---------+------+---------+----------+---------+
1 row in set (0.00 sec)
mysql> select 'latinica' = 'латиница';
+---------------------------------+
| 'latinica' = 'латиница'         |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select _utf8 'latinica' collate utf8_serbian_ci  = _utf8 'латиница' collate utf8_serbian_ci;
+----------------------------------------------------------------------------------------------+
| _utf8 'latinica' collate utf8_serbian_ci  = _utf8 'латиница' collate utf8_serbian_ci         |
+----------------------------------------------------------------------------------------------+
|                                                                                            1 |
+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
VN:F [1.9.22_1171]
Rating: +6 (from 6 votes)

Smeće u bazi, po ko zna koji put…

Standardna početnička greška (ne setovanje enkodinga konekcije) vrlo često rezultuje velikim problemom zvanim smeće u bazi. Primer problema je standardna PHP greška

1. aplikacija misli da radi sa utf8 (forsiran je utf8 enkoding u hederu html-a, web enkodira karatktere kao utf8 i očekuje ih kao utf8)
2. baza čuva podatke kao utf8
3. NIKO NIJE SETOVAO ENKODING KONEKCIJE što u php slučaju znači da je enkoding defaultni – LATIN1.

Šta se desi kada u ovom slučaju pošaljemo utf8 karakter Č u tabelu. Kako je php glup on to pošalje kako ga ima u memoriji, dakle on mysql drajveru pošalje ta dva bajta od kojih je karakter Č sastavljen. Pošto je enkoding konekcije LATIN1 koji ima jednobajtne karaktere, mysql ta dva bajta vidi kao DVA latin1 karaktera, i svaki od njih upiše kao jedan trobajtni utf8 karakter. Sada u polju na mysql-u imam 6 bajtova tj dva karaktera umesto jedan. Kada sledeci put pročitate taj podatak, mysql će prekodirati ta dva utf8 karaktera u 2 jednobajtna latin1 karaktera i vratiti ih php-u koji će ta dva karaktera poslati web browseru koji će pošto očekuje utf8 to pogrešno interpretirati kao utf8 karakter i prikazati slovo Č.

Dakle poslali smo Č, pročitali smo Č – gde je problem? Problem je u tome što u bazi ne piše Č, što sortiranje tog stringa neće biti kao da se na tom mestu nalazi Č, što poredjenje neće raditi, što računanje dužine neće raditi, što zauzima duplo više mesta u bazi…. i najzad, što ako probate da pročitate taj podatak VALIDNO – videćete da je u bazi SMEĆE.

Kako rešiti ovaj problem kada ga zateknemo?

Dakle ako imamo tabelu:

create table `smece` (
  `id` int auto_increment primary key not null,
  `djubre` varchar(100) character set utf8
) engine=myisam;

i imamo aplikaciju sa početničkom greškom:

< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<body>

<form action="djubre.php" method="post">
<input name="q" type="text" />
<input type="submit" />
</form>

< ?php
mysql_connect(':/tmp/mysql.sock', 'root', '') or die(mysql_error());
mysql_select_db('test') or die (mysql_error());
$res = mysql_query('select djubre from smece');
while ($row=mysql_fetch_row($res)) echo $row[0].'<br/>';
@mysql_free_result($res);

if ( isset( $_POST['q'] )  ) {
  $djubre = $_POST['q'];
  mysql_query("insert into smece (djubre) values ('$djubre')");
  mysql_close();
}
?>
</body>
</html>

na web-u se vidi:

dšdšdšd
dasdad
dšdšdšd
dššdšdšdš
ccccccccccc
šššššššššš
ccccccccccccc

ali ako pogledamo u bazi vidimo smeće:

mysql> select * from smece;
+----+-------------------------------------------------------------------+
| id | djubre                                                            |
+----+-------------------------------------------------------------------+
|  1 | ÄÅ¡ÄÅ¡ÄÅ¡Ä                                  |
|  2 | dasdad                                                            |
|  3 | ÄÅ¡ÄÅ¡ÄÅ¡Ä                                  |
|  4 | ÄÅ¡Å¡ÄÅ¡ÄÅ¡ÄÅ¡                          |
|  5 | ÄÄÄÄÄÄÄÄÄÄÄ                      |
|  6 | Å¡Å¡Å¡Å¡Å¡Å¡Å¡Å¡Å¡Å¡                          |
|  7 | ÄÄÄÄÄÄÄÄÄÄÄÄÄ |
+----+-------------------------------------------------------------------+
7 rows in set (0.00 sec)
mysql> select hex(djubre) from smece;
+------------------------------------------------------------------------------------------------------------------------------------+
| hex(djubre)                                                                                                                        |
+------------------------------------------------------------------------------------------------------------------------------------+
| C384E28098C385C2A1C384E28098C385C2A1C384E28098C385C2A1C384E28098                                                                   |
| 646173646164                                                                                                                       |
| C384E28098C385C2A1C384E28098C385C2A1C384E28098C385C2A1C384E28098                                                                   |
| C384E28098C385C2A1C385C2A1C384E28098C385C2A1C384E28098C385C2A1C384E28098C385C2A1                                                   |
| C384C28DC384C28DC384C28DC384C28DC384C28DC384C28DC384C28DC384C28DC384C28DC384C28DC384C28D                                           |
| C385C2A1C385C2A1C385C2A1C385C2A1C385C2A1C385C2A1C385C2A1C385C2A1C385C2A1C385C2A1                                                   |
| C384E280A1C384E280A1C384E280A1C384E280A1C384E280A1C384E280A1C384E280A1C384E280A1C384E280A1C384E280A1C384E280A1C384E280A1C384E280A1 |
+------------------------------------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)

Ovo smeće se na webu i dalje vidi kako treba !!!

sada da bi ovo smeće prebacili u ispravan zapis:

mysql> alter table smece change djubre djubre varchar(100) character set latin1;
Query OK, 7 rows affected (0.00 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> alter table smece change djubre djubre blob;
Query OK, 7 rows affected (0.00 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> alter table smece change djubre djubre varchar(100) character set utf8;
Query OK, 7 rows affected (0.01 sec)
Records: 7  Duplicates: 0  Warnings: 0
mysql> select * from smece;
+----+----------------------------+
| id | djubre                     |
+----+----------------------------+
|  1 | dšdšdšd             |
|  2 | dasdad                     |
|  3 | dšdšdšd             |
|  4 | dššdšdšdš         |
|  5 | ccccccccccc     |
|  6 | šššššššššš       |
|  7 | ccccccccccccc |
+----+----------------------------+
7 rows in set (0.00 sec)

mysql> select hex(djubre) from smece;
+------------------------------------------------------+
| hex(djubre)                                          |
+------------------------------------------------------+
| C491C5A1C491C5A1C491C5A1C491                         |
| 646173646164                                         |
| C491C5A1C491C5A1C491C5A1C491                         |
| C491C5A1C5A1C491C5A1C491C5A1C491C5A1                 |
| C48DC48DC48DC48DC48DC48DC48DC48DC48DC48DC48D         |
| C5A1C5A1C5A1C5A1C5A1C5A1C5A1C5A1C5A1C5A1             |
| C487C487C487C487C487C487C487C487C487C487C487C487C487 |
+------------------------------------------------------+
7 rows in set (0.00 sec)

i voila, u bazi vise nije smeće nego validan sadržaj. Ako se sad vratimo na aplikaciju, na webu se sad vide neke nove kuke i kvake:

?�?�?�?
dasdad
?�?�?�?
?��?�?�?�
???????????
����������
?????????????

sve što treba da uradimo je da setujemo pravilno enkoding u aplikaciji

< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<body>
<form action="djubre.php" method="post">
<input name="q" type="text" />
<input type="submit" />
</form>

< ?php
mysql_connect(':/tmp/mysql.sock', 'root', '') or die(mysql_error());
mysql_select_db('test') or die (mysql_error());

$res = mysql_query(“set names ‘utf8′”);

$res = mysql_query('select djubre from smece');
while ($row=mysql_fetch_row($res)) echo $row[0].'<br/>';
@mysql_free_result($res);

if ( isset( $_POST['q'] )  ) {
  $djubre = $_POST['q'];
  mysql_query("insert into smece (djubre) values ('$djubre')");
  mysql_close();
}
?>
</body>
</html>

i problem rešen.

VN:F [1.9.22_1171]
Rating: +10 (from 14 votes)
July 7, 2010 • Posted in: Razno • 33 Comments

Particionisanje podataka

Pre nekog sitnog vremena jedna firma me zamolila da im malo protrkeljam sistem da vidim sta bi moglo da se ubrza posto imaju veliku bazu, zahtev za velikim brojem upita (uglavnom read) ali im sve to vrlo traljavo radi. Po iskustvu pretpostavio sam neke osnovne greske u postavci sistema (los server, lose iskonfigurisan mysql, ugasen ili lose podesen query cache etc) ali kada sam stigao na teren – sve moje pretpostavke su bile pogresne. MySQL je bio vrlo optimalno konfigurisan, server je zmija (8 jezgara, 15000RPM diskovi u raidu, mnogo rama…)… sumnja je naravno odma pala na lose upite. Pogledavsi upite, ni tu nije bilo sta mnogo da se “ubrza” … neke sitnice smo ubrzali par stotina puta no to nije mnogo uticalo na ukupnu sporost celog sistema, te sam se usresredio na samu strukturu i kvalitet podataka.

CPU LOAD

CPU LOAD

Baza ima stotinjak tabela od kojih su vecma sve poprilicno male po horizontali – sto generalno govori da je baza prilicno dobro normalizovana. Atributske tabelice su reda velicine par stotina do par hiljada slogova sto nije puno, ali “glavna” velika tabela, iako dobro normalizovana, ima oko 250 miliona slogova. Upiti koji se izvrsavaju nad tom tabelom i mnoze sa atributskim tabelama zahtevaju prolazak kroz veliki broj slogova i ma koliko indexi bili korisni ako imate agregatnu funkciju nad 10000 slogova, to prosto znaci da morate da prodjete kroz 10000 slogova, procitate svaki, uzmete vrednost, ubacite je u agregatnu funkciju … tu indexi na zalost ne pomazu mnogo …  Posle malo dublje analize zakljucio sam da bi bilo realno da se ta glavna tabela particionise po jednom delu primarnog kljuca. Ako pogledamo kako radi partitioning na mysql-u zakljucicemo da je svaka operacija nad vise particija “mnogo” sporija nego u slucaju da nema particija ali sam ja ovaj put resio da batalim “opste brojke” i izmerim sam u realnom sistemu kakva je razlika. Operacije koje idu nad CELOM tabelom (znaci SVIM particijama) su radile oko 2.5% sporije nego na neparticionisanim podacima – dakle prilicno zadovoljavajuci rezultat ako se pokaze da se upiti nad jednom particijom izvrsavaju brze (posebno sto tih upita ima znacajno vise). Podaci nad jednom particijom su radili oko 40 PUTA brze :). I ne samo da je brzina izvrsavanja svakog upita veca, tokom izvrsavanja upita stres nad samim serverom je mnogostruko manji (i do 200 puta manji IO, 30tak puta manji user cpu usage …)

SERVER LOAD

SERVER LOAD

Grafikoni koje vidite pokazuju CPU USAGE i AVERAGE LOAD na serveru u nekom vremenskom periodu. Pretpostavite trenutak kada smo ukljucili particionisanje podataka :)

MySQL podrzava partitioning od verzije 5.1. U osnovi, MySQL partitioning radi tako da vasu tabelu podeli u male tabele (svaka particija fizicki na disku postane zasebna tabela) i kada optimizer prepozna da moze upit da izvrsi nad samo jednom particijom, operaciju vrsi nad tom jednom “tabelicom”, ako upit mora da izvrsava nad vise tabela, onda se odredjuje da li moze da sekvencijalno koristi jednu pa drugu pa … ili mora da pravi “join” izmedju particija. U slucaju da se pravi join tada je pristup particionisanim podaci nesto sporiji nego kada oni nisu particionisani. U slucaju upisa i slicno podatak se upisuje u “odgovarajucu tabelu”. Ono sto je kod particionisanja vrlo zgodno je to sto mozete

Ako resite da probate mysql paritioning, obavezno procitajte i deo o limitima istog.

VN:F [1.9.22_1171]
Rating: +10 (from 10 votes)
June 2, 2010 • Tags:  • Posted in: Razno, Support • 6 Comments