<?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>UGamela Blog &#187; MySQL</title>
	<atom:link href="http://ugamela-blog.pheelgood.net/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://ugamela-blog.pheelgood.net</link>
	<description>Entwicklung eines Browsergames</description>
	<lastBuildDate>Mon, 12 Dec 2011 18:28:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>MySQL Multi Update</title>
		<link>http://ugamela-blog.pheelgood.net/2009/01/05/mysql-multi-update/</link>
		<comments>http://ugamela-blog.pheelgood.net/2009/01/05/mysql-multi-update/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 14:56:40 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=180</guid>
		<description><![CDATA[Ich traue mich jetzt einfach mal einen Artikel über Performance zu verfassen. Ein paar Leute meinten schon ich würde mir viel zu viel Sorgen über Performance und Optimisation machen, dabei möchte ich es doch nur gleich beim ersten Anlauf richtig machen. Multi Update: Mehrere Datensätze einer Tabelle haben sich geändert und sollen aktualisiert werden. Anstatt [...]]]></description>
			<content:encoded><![CDATA[<p>Ich traue mich jetzt einfach mal einen Artikel über Performance zu verfassen. Ein paar Leute meinten schon ich würde mir viel zu viel Sorgen über Performance und Optimisation machen, dabei möchte ich es doch nur gleich beim ersten Anlauf richtig machen.</p>
<p>Multi Update: Mehrere Datensätze einer Tabelle haben sich geändert und sollen aktualisiert werden. Anstatt nun jede Menge einzelne Queries zu schreiben gibts es nun zwei Methoden dies möglichst schnell ablaufen zu lassen.</p>
<p><span id="more-180"></span></p>
<h2>1. Die CASE Methode</h2>
<blockquote><p>UPDATE test</p>
<p>SET bla = CASE id</p>
<p>WHEN 1 THEN &#8216;flubb&#8217;</p>
<p>WHEN 2 THEN &#8216;blubb&#8217;</p>
<p>END</p>
<p>WHERE id IN (1,2)</p></blockquote>
<p>Innerhalb eines einzigen Querys werden mehrere Einträge verändert.</p>
<h2>2. Die PREPARED Methode</h2>
<p>Zuerst wie gewünscht eine kleine Einführung in mysqli bzw. meine Datenbankabstraktion:</p>
<p><a title="Interface DatabaseStatement" href="http://nopaste.biz/61036" target="_blank">Link</a> (englisch) Wer mysqli oder PDO noch nicht kennt sollte sich umbedingt informieren!</p>
<blockquote><p>$stmt = $db-&gt;prepare(&#8216;UPDATE test SET bla = ? WHERE id = ?, &#8216;sd&#8217;);</p>
<p>$stmt-&gt;execute(array(&#8216;flubb&#8217;, 5));</p>
<p>$stmt-&gt;execute(array(&#8216;blubb&#8217;, 13));</p></blockquote>
<p>Ein Query wird mit Platzhaltern gefüllt und mehrmals ausgeführt.</p>
<h2>Performancevergleich</h2>
<p>Ich habe das nun mit zwei Einträgen getestet und 100 bis 10000 Einträge verändert.</p>
<p>Interessantes:</p>
<ul>
<li>CASE  skaliert sehr schlecht, bei mehr Arbeit braucht das Query vergleichsweise viel länger</li>
<li>Mein MySQL Client meldet sich ab, wenn ich 10000 Einträge mit CASE updaten will</li>
<li>PREPARED skaliert sehr gut, bei doppelter Anzahl Einträge brauchen die Queries doppelt so lange</li>
<li>Bei unter 1000 Einträgen ist CASE schneller als PREPARED</li>
<li>Für 10000 Einträge braucht PREPARED weniger lange als CASE für 5000</li>
</ul>
<h3>Schlussfolgerung:</h3>
<p>CASE und PREPARED haben verschiedene Vor- und Nachteile. Für wenige Einträge (&lt;1000 Felder upzudaten) bietet sich CASE an. Für große Datenmengen sollte PREPARED verwendet werden.</p>
<p>Ich werde CASE verwenden, zumal ich schon den nötigen Code geschrieben habe um automatisch Queries zu erzeugen.</p>
<p>** Anmerkung: Die Tests wurden auf meinem Laptop (C2D 2&#215;2,4Ghz, 2GB RAM) ausgeführt und sind nur subjektiv. Ich denke dennoch, dass die Ergebnisse auf anderen Systemen durchaus ähnlich ausfallen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2009/01/05/mysql-multi-update/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP5 OOP Interfaces</title>
		<link>http://ugamela-blog.pheelgood.net/2008/12/09/php5-oop-interfaces/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/12/09/php5-oop-interfaces/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 21:31:23 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Datenbankabtraktion]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=168</guid>
		<description><![CDATA[Zu Deutsch &#8220;Schnittstellen&#8221;. Ich habe gemerkt, dass dieser Begriff sofort zu einer Fehlinterpretation führt, jedenfalls wars bei mir so. Ich hab diesen ganzen OOP Kram sowieso mind. zehn Mal lesen müssen, bis ich ihn annähernd gerafft hab. Einige Sachen sind mir immer noch unklar. Die letzten Tage bin ich aber endlich darauf gekommen, wofür man [...]]]></description>
			<content:encoded><![CDATA[<p>Zu Deutsch &#8220;Schnittstellen&#8221;. Ich habe gemerkt, dass dieser Begriff sofort zu einer Fehlinterpretation führt, jedenfalls wars bei mir so. Ich hab diesen ganzen OOP Kram sowieso mind. zehn Mal lesen müssen, bis ich ihn annähernd gerafft hab. Einige Sachen sind mir immer noch unklar.</p>
<p>Die letzten Tage bin ich aber endlich darauf gekommen, wofür man diese Interfaces in PHP verwenden kann.</p>
<h3>Zuerst einmal: <span style="text-decoration: underline;">Was ist so ein Interface?</span></h3>
<p>Interfaces sind Klassen, die bestimmte Funktionen vorbestimmen. Die Funktionen bilden dann eine Schnittstelle, also eine bestimmte Möglichkeit von anderen Objekten angesprochen zu werden. Im Gegensatz zu anderen Klassen werden Schnittstellen implementiert (&#8220;implements&#8221;). Dadurch kann eine Klasse mehrere Schnittstellen haben, aber nur von einer einzigen normalen Klasse abstammen.</p>
<p>Man muss also nur die Schnittstelle kennen, um die Klasse verwenden zu können, die sie implementiert. Anders gesagt, man kann die Klasse so verwenden wie man die Schnittstelle als Klasse verwenden würde.</p>
<h3>Sehr konkrete Beispiele liefert PHP selbst mit einigen Schnittstellen:</h3>
<p>ArrayAcces: Die Objekte einer Klasse lassen sich wie Arrays ansprechen.<br />
Iterator: Die Eigentschaften einer Objekts lassen sich iterieren, also auf eine bestimmte Weise durchlaufen.</p>
<h3>Interfaces lassen sich aber auch noch weit abstrakter verwenden:</h3>
<p>Ich schreibe ein Interface Datenbankverbindung, das ich aus praktischen Gründen dokumentiere. Ich weise nochmal darauf hin, dass dieses Interfaces keinen Programmcode enthält, es gibt nur Struktur vor.</p>
<p>Danach schreibe ich einen Dekorierer für meine mysqli Klasse und achte derweil auch etwas darauf, wie PDO aufgebaut ist, denn wahrscheinlich wird das eine weitere mögliche Datenbankverbindung (-&gt;Interfacename&#8230;) mysqli wird etwas zurechtgebogen und erweitert.</p>
<p><span style="text-decoration: underline;"><strong>Resultat:</strong></span> Ich kann verschiedene Datenbankklassen nach ein paar Anpassungen verwenden. Ich benutze mysqli, weil es anscheinend die schnellste ist, was MySQL angeht. Letztlich verwende ich Typehints auf &#8220;Datanbankverbindung&#8221; und Autovervollständigung für das Interface, welches ich dokumentiert (phpDoc, Zend Studio) habe.</p>
<p>Ich hoffe, ich habe es etwas anschaulicher erklärt, als es das Handbuch tut. Ich erinnere nocheinmal daran, dass dies keineswegs einfach ist und ich selbst lange gebraucht habe es zu verstehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/12/09/php5-oop-interfaces/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>MySQL Events</title>
		<link>http://ugamela-blog.pheelgood.net/2008/11/04/mysql-events/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/11/04/mysql-events/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 16:59:18 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Daemon]]></category>
		<category><![CDATA[Eventhandler]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=109</guid>
		<description><![CDATA[MySQL Events gibt es schon seit MySQL 5.1, aber ich habe sie erst diese Woche entdeckt. Meiner Meinung nach eine geniale Erfindung, weil sie mit ein wenig MySQL Kenntnissen Cronjobs ersetzen kann. Die anstehenden Änderungen müssen zwar vollständig innerhalb des MySQL und damit in der Datenbank ablaufen, sind dafür aber deutlich flexibler und verlässlicher als [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://dev.mysql.com/doc/refman/5.1/en/events.html">MySQL Events</a> gibt es schon seit MySQL 5.1, aber ich habe sie erst diese Woche entdeckt.</p>
<p>Meiner Meinung nach eine geniale Erfindung, weil sie mit ein wenig MySQL Kenntnissen Cronjobs ersetzen kann. Die anstehenden Änderungen müssen zwar vollständig innerhalb des MySQL und damit in der Datenbank ablaufen, sind dafür aber deutlich flexibler und verlässlicher als Cronjobs. Für mich ist die Handhabung sogar einfacher.</p>
<p>Diese Events eignen sich auch um einen Daemon auf MySQL Basis zu schreiben, der sehr datenbanknah arbeitet. Events werden dadurch in Echtzeit ausgeführt, anstatt, wie beim klassischen Eventhandler, bei jedem Aufruf durchgeführt und zurückberechnet. Das macht einiges deutlich einfacher.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/11/04/mysql-events/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

