Poslednji osvrt na 2009

Došao je i taj poslednji dan u 2009. godini kada je red malo se osvrnuti natrag da vidimo šta smo sve prošli pre nego otvorimo šampanjac i zakoračimo u Novu 2010 Godinu.

U Januar smo tradicionalno zakoračili sa Božićnim SMS Čestitkama a tih dana zbog problema sa ruskim gasom bilo je veoma bitno da imate nekoga da vas greje oko srca.

U Februaru nas je ponovo posetio Iron Maiden a ja sam nakon što sam očistio par metara snega zapalio na aerodrom i odleteo preko bare na sjajnu FOWA konferenciju.

U Martu sam saznao da čak i u doba surovog kapitalizma u Srbiji stvari i dalje funkcionišu sa primesama Balkanskog šarma što se kod mog poziva broja 988 ispostavilo kao veoma dobra stvar.

U Aprilu sam objavio tobožnji kraj posle 4 godina Blogovanja a Blogodak je kao uveo članarinu preko infostana. Zbog ove dve zajebancije i dan danas dobijam mailove tipa “A ko sada piše na dinke.net”, a tu i tamo javi mi se poneki zabrinuti korisnik Blogotka zbog računa za infostan 🙂

U Maju sam po prvi put dobio i SMS Scam, a imali smo zadovoljstvo da prisustvujemo sjajnom takmičenju u Driftu u ovoj našoj maloj kasabi.

U Junu sam napisao opsežnu analizu o stanju u srpskom tenisu a Nick Slotter nas je konačno posetio nakon što smo sami morali da se postaramo za predsednika.

U Julu smo uz novi Firefox 3.5 proslavili tačno 40 godina od spuštanja na mesec, a ja sam napisao interesantno poređenje Top Sajtova i Top Tenisera.

U Avgustu smo najavili još jedan Blogopen, a postao sam i korisnik Twittera nakon čega je isti bio down gotovo 48 sati. Apple je izbacio Snow Leopard koji naravno nije bilo moguće tek tako poručiti online jer … Your country is not supported!

U Septembru smo imali još jedno druženje na Blogopenu, upoznao neke veoma drage ljude a Niš ponovo vratio na listu omiljenih gradova.

U Oktobru smo saznali da Microsoft ima još mnogo toga da nauči od Apple-a (barem kada je marketing u pitanju), a imali smo i još jedan BizzBuzz.

U Novembru sam nakon što sam po n-ti put ispušio za iPhone odlučio da sebe počastim sjajnim HTC Hero-om, koji je baš ovih dana čak i kod nas dobio laskavi status telefona godine.

I Decembar … busy month gde sam se na Blogu konačno vratio svojim korenima – pisanjem korisnih tekstova o stvarima od kojih živim … još uvek 🙂

Nadam se da će nam 2010 biti barem isto ovako dobra.

Srećna Nova Godina

MySQL: Brisanje pomoću Left Join-a

Danas sam ponovo morao da se pozabavim jednom ogromnom tabelom i uklonim sve podatke iz nje koji nisu imali odgovajuće reference u drugoj tabeli, idealan podsetnik koliko su podupiti u MySQL-u sporiji od Joinova 🙂

Da malo objasnim situaciju, imam skript koji između ostalog generiše tzv. “typo” domene, tako da imam jednu master_domains tabelu sa originalnim domenima i result_domains sa generisanim tipo domenima. Nešto poput ovoga:

mysql> describe master_domains;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 
| domain | varchar(255)     | NO   | UNI | NULL    |                | 
+--------+------------------+------+-----+---------+----------------+
2 rows in set (0.07 sec)

mysql> describe result_domains;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 
| domain    | varchar(255)     | NO   | UNI | NULL    |                | 
| master_id | int(10) unsigned | YES  | MUL | NULL    |                | 
+-----------+------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

Tabela result_domains ima polje master_id koje je spolji ključ ka id polju u master_domains tabeli. E sad, obzirom da pored ovoga takođe imam domene koji se na razne druge načine generišu (komplikovano za objasniti), danas sam imao zadatak da između ostalog počistim sve domene iz master_domains tabele koji nemaju odgovarajući ključ (master_id) u result_domains tabeli.

Pomoću pod upita ovo se može postići jednostavnim kverijem poput ovoga:

delete from master_domains where id not in 
(select master_id from result_domains_frontend)

Obzirom da se držim pravila da pre svakog brisanja odradim i select kveri sa istim parametrima u where klauzi, došli smo do ovog select kverija:

select * from master_domains where id not in 
(select master_id from result_domains_frontend) limit 10

Međutim on se izvršavao toliko dugo da sam nakon nekoliko minuta rešio da ga prekinem. Pouzdano znam da su podupiti mnogo sporiji od join-ova (iako su daleko elegantniji za pisanje), tako da sam rešio da isti kveri napišem jednim left joinom.

Left Join je savršeno oruđe kada želite da nađete one podatke iz prve (leva) tabele koji ne postoje u drugoj tabeli. Oni takođe imaju izvesne prednosti u odnosu na podupite obzirom da se izvršavaju znatno brže a uz to su i kompatibilni sa starijim verzijama MySQL-a koje podupite ne podržavaju (MySQL < 5.x). Međutim delete sintaksa je malo drugačija tako da sam nakon par pokušaja i listanja manuala došao do sledećeg ekvivalenta:

delete master_domains.* from master_domains 
left join result_domains_frontend 
on master_domains.id=result_domains_frontend.master_id 
where result_domains_frontend.master_id is null ;

I nakon par desetina sekundi došlo se do konačnog rezultata:

mysql> delete master_domains.* from master_domains 
left join result_domains_frontend 
on master_domains.id=result_domains_frontend.master_id 
where result_domains_frontend.master_id is null ;
Query OK, 270558 rows affected (46.58 sec)
mysql> 

MySQL: Prebacivanje tabele iz jedne baze u drugu

Za prebacivanje tabele iz jedne baze u drugu, u novoj bazi možete kreirati novu tabelu sa identičnom shemom kao kod stare (create table foo_new like foo) i jednostavno prekopirati podatke sa jednim insert into/select kverijem. Međutim postoji i mnogo jednostavniji način, koji je naročito pogodan u slučaju da baratate sa velikim tabelama.

Kao što verovatno već znate, za promenu imena tabela u MySQL-u možete koristiti jedan od ova dva kverija:

ALTER TABLE foo RENAME TO new_foo;

ili

RENAME TABLE foo TO new_foo;

U slučaju da želite da premestite tabelu iz jedne baze u drugu, najjednostavniji način je da ih jednostavno preimenujete koristeći db prefix prilikom referenciranja na novo i staro ime. Na primer ako želite da prebacite tabelu foo iz currentdb u newdb učinićete nešto ovako:

ALTER TABLE currentdb.foo RENAME TO newdb.foo;

ili

RENAME TABLE currentdb.foo TO newdb.foo;

Inače kad već pričamo o RENAME klauzi da napomenem da za razliku od ALTER kverija, kod RENAME možete preimenovati više tabela od jednom, što je veoma korisno kada jednostavno želite da zamenite (swap) dve tabele:

RENAME TABLE table1 TO temp, table2 TO table1, temp TO table2;