<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mihai Brehar &#187; MySQL</title>
	<atom:link href="http://www.mihaibrehar.ro/blog/category/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mihaibrehar.ro/blog</link>
	<description>consultant eCommerce, programator, vanzator de sosete</description>
	<lastBuildDate>Fri, 03 Sep 2010 14:22:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mysql și mesajele de eroare</title>
		<link>http://www.mihaibrehar.ro/blog/mysql-i-mesajele-de-eroare.html</link>
		<comments>http://www.mihaibrehar.ro/blog/mysql-i-mesajele-de-eroare.html#comments</comments>
		<pubDate>Thu, 29 Jan 2009 23:03:50 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[erori]]></category>
		<category><![CDATA[triggers]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=321</guid>
		<description><![CDATA[Se dă un query de genul:

INSERT INTO request&#40;`project_id`, `user_id`, `request_body`, `planned_date`&#41; VALUES &#40;1,22,&#8216;blabla&#8217;,&#8216;2009-01-31 04:16:27&#8242;&#41;

la care se primește eroarea:
Column not found: 1054 Unknown column &#8216;project_id&#8217; in &#8216;where clause
WTF? Where clause pentru un query de tip INSERT?
După câteva secunde de gândire, vine și răspunsul: eroarea era într-un trigger. În astfel de cazuri, niște erori puțin mai detaliate [...]]]></description>
			<content:encoded><![CDATA[<p>Se dă un query de genul:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">INSERT</span> <span class="kw1">INTO</span> request<span class="br0">&#40;</span><span class="st0">`project_id`</span>, <span class="st0">`user_id`</span>, <span class="st0">`request_body`</span>, <span class="st0">`planned_date`</span><span class="br0">&#41;</span> <span class="kw1">VALUES</span> <span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">22</span>,<span class="st0">&#8216;blabla&#8217;</span>,<span class="st0">&#8216;2009-01-31 04:16:27&#8242;</span><span class="br0">&#41;</span></div>
</div>
<p>la care se primește eroarea:</p>
<div class="codesnip-container" >Column not found: 1054 Unknown column &#8216;project_id&#8217; in &#8216;where clause</div>
<p>WTF? Where clause pentru un query de tip INSERT?</p>
<p>După câteva secunde de gândire, vine și răspunsul: eroarea era într-un trigger. În astfel de cazuri, niște erori puțin mai detaliate ar fi binevenite.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/mysql-i-mesajele-de-eroare.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Optimizarea bazelor de date: agregarea datelor</title>
		<link>http://www.mihaibrehar.ro/blog/optimizarea-bazelor-de-date-agregarea-datelor.html</link>
		<comments>http://www.mihaibrehar.ro/blog/optimizarea-bazelor-de-date-agregarea-datelor.html#comments</comments>
		<pubDate>Sun, 28 Sep 2008 21:01:57 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[baza de date]]></category>
		<category><![CDATA[optimizare]]></category>
		<category><![CDATA[triggers]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=48</guid>
		<description><![CDATA[Era MySQL 4.x a trecut de mult, ca să nu mai vorbesc de 3.x. Oh, ce vremuri de „pionierat”.
MySQL 5 a venit cu o gramada de bunătăți (ce existau demult în alte DBMS) și totuși, încă văd o mulțime de aplicații web care nu folosesc avantajele oferite de noua versiune. De fapt, de ce mă [...]]]></description>
			<content:encoded><![CDATA[<p>Era MySQL 4.x a trecut de mult, ca să nu mai vorbesc de 3.x. Oh, ce vremuri de „pionierat”.</p>
<p>MySQL 5 a venit cu o gramada de bunătăți (ce existau demult în alte DBMS) și totuși, încă văd o mulțime de aplicații web care nu folosesc avantajele oferite de noua versiune. De fapt, de ce mă mir? Încă văd aplicații ce se doresc a fii serioase și folosesc tabele MyISAM. Tranzacții? Foreign keys? Prostii&#8230;cine are nevoie de ele?</p>
<p>Dar nu despre tranzacții și foreign keys vreau să vorbesc, ci despre <strong>triggers</strong> &#8211; o funcționalitate apărută în MySQL 5. Orice programator care a avut de-a face cu baze de date ar trebui să știe ce e un trigger, așa că nu o să explic conceptul. O să dau doar un exemplu în care un trigger poate să-ți ușureze viața. Presupunem că avem următoarele tabele:</p>
<table border="0" cellspacing="5" cellpadding="5">
<tbody>
<tr>
<td><span style="text-decoration: underline;"><strong>customer</strong></span></td>
<td><span style="text-decoration: underline;"><strong>customer_payments</strong></span></td>
</tr>
<tr>
<td><em>customer_id</em></td>
<td>payment_id</td>
</tr>
<tr>
<td>firstname</td>
<td><em>customer_id</em></td>
</tr>
<tr>
<td>lastname</td>
<td>payment_amount</td>
</tr>
</tbody>
</table>
<p>Pentru a afla totalul plăților făcute de fiecare client în parte, avem un query de genul:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">SELECT</span> firstname, lastname, sum<span class="br0">&#40;</span>payment_amount<span class="br0">&#41;</span> <span class="kw1">AS</span> total_payments <span class="kw1">FROM</span> customer <span class="kw1">INNER</span> <span class="kw1">JOIN</span> customer_payments <span class="kw1">USING</span><span class="br0">&#40;</span>customer_id<span class="br0">&#41;</span> <span class="kw1">GROUP</span> <span class="kw1">BY</span> customer_id</div>
</div>
<p>Cazul cu un singur join este unul fericit și l-am luat doar pentru simplitatea exemplului. În realitate însă, query-urile de acest gen pot deveni mari consumatoare de resurse.</p>
<p>Putem scăpa de join-ul respectiv dacă adaugăm un câmp în tabela <strong>customer</strong>, câmp care va conține suma tuturor plăților făcute de un client. Noua tabelă va arăta așa:</p>
<table border="0" cellspacing="5" cellpadding="5">
<tbody>
<tr>
<td><span style="text-decoration: underline;"><strong>customer</strong></span></td>
</tr>
<tr>
<td>customer_id</td>
</tr>
<tr>
<td>firstname</td>
</tr>
<tr>
<td>lastname</td>
</tr>
<tr>
<td>total_payments</td>
</tr>
</tbody>
</table>
<p>Câmpul <strong>total_payments</strong> va fi actualizat automat (cu ajutorul unui trigger, evident) la fiecare adăugare, ștergere sau modificare a unei înregistrări din tabela customer_payments.</p>
<p><strong>Costul</strong> actualizării câmpului total_payments <strong>este net inferior</strong> costului unui JOIN făcut de mii de ori pe zi.</p>
<p><strong>/Actualizare</strong>: poate un exemplu mai bun era cu articolele dintr-un blog și comentariile la articole.</p>
<p><strong>/Actualizare 2</strong>: vreau să accentuez faptul că soluția dată mai sus trebuie aplicată doar când situația o cere, nu la fiecare join cu group by si sum()</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/optimizarea-bazelor-de-date-agregarea-datelor.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
