<?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>Webdesign Informatik &#187; InnoDb</title>
	<atom:link href="http://www.webdesign-informatik.de/tag/innodb/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.webdesign-informatik.de</link>
	<description>Internet : SEO : Programmierung : Datenbank : Linux</description>
	<lastBuildDate>Sat, 19 Nov 2011 11:11:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MySQL Datenbank tunen mit InnoDb und Indizes</title>
		<link>http://www.webdesign-informatik.de/mysql/mysql-datenbank-tunen-mit-innodb-und-indizes/</link>
		<comments>http://www.webdesign-informatik.de/mysql/mysql-datenbank-tunen-mit-innodb-und-indizes/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 13:32:10 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[DirectUrl]]></category>
		<category><![CDATA[InnoDb]]></category>
		<category><![CDATA[MySQL Tuning]]></category>
		<category><![CDATA[XT Commerce]]></category>

		<guid isPermaLink="false">http://www.webdesign-informatik.de/?p=91</guid>
		<description><![CDATA[Es sind nur ein paar Handgriffe, die Welten bewegen. Ich hatte eine SQL Abfrage mit ein paar Joins, die bei steigender Anzahl von Datensätzen bis zu 5 Minuten dauerte. Das konnte so natürlich nicht weitergehen, also hab ich kurz eine Relation mittels Fremdschlüssel in der Datenbank-Struktur realisiert und die Abfrage dauerte von nun an 2 [...]]]></description>
			<content:encoded><![CDATA[<p>Es sind nur ein paar Handgriffe, die Welten bewegen. Ich hatte eine SQL Abfrage mit ein paar Joins, die bei steigender Anzahl von Datensätzen bis zu 5 Minuten dauerte. Das konnte so natürlich nicht weitergehen, also hab ich kurz eine Relation mittels Fremdschlüssel in der Datenbank-Struktur realisiert und die Abfrage dauerte von nun an 2 Sekunden &#8211; Wahnsinn! Das Problem mit der Geschwindigkeit hatte ich übrigens auch bei jedem XT Commerce Shop mit mehreren Hundert oder Tausend Artikeln, bei dem DirectUrl für suchmaschinenfreundliche URLs installiert ist. Das Problem ist, das DirectUrl die Tabelle mit den Alias-URLs  bei jeder Änderung des Produktkatalogs, der Kategorien und der Content Seiten neu erstellt. In Bezug auf das Bearbeiten von Produkten und Kategorien können wir das Laden von 5 Minuten auf 2 Sekunden verringern.  Die folgende MySQL Code zeigt die modifizierte Tabellenstruktur mit Indizes für die DirectUrl-Alias-Tabelle.<span id="more-91"></span></p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="kw1">IF</span> <span class="kw1">NOT</span> <span class="kw1">EXISTS</span> bluegate_seo_url <span class="br0">&#40;</span><br />
&nbsp; &nbsp; url_md5 varchar<span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span>,<br />
&nbsp; &nbsp; url_text varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span>,<br />
&nbsp; &nbsp; products_id int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,<br />
&nbsp; &nbsp; categories_id int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,<br />
&nbsp; &nbsp; content_group int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span>,<br />
&nbsp; &nbsp; language_id int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="nu0">0</span>,<br />
&nbsp; &nbsp; <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> &nbsp;<span class="br0">&#40;</span>url_md5<span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; <span class="kw1">KEY</span> url_text <span class="br0">&#40;</span>url_text,products_id<span class="br0">&#41;</span>,</p>
<p>&nbsp; &nbsp; <span class="kw1">INDEX</span> fk_products_description <span class="br0">&#40;</span>products_id <span class="kw1">ASC</span><span class="br0">&#41;</span> ,<br />
&nbsp; &nbsp; CONSTRAINT fk_products_description<br />
&nbsp; &nbsp; <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span>products_id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">REFERENCES</span> products_description <span class="br0">&#40;</span>products_id<span class="br0">&#41;</span> ,</p>
<p>&nbsp; &nbsp; <span class="kw1">INDEX</span> fk_categories_description <span class="br0">&#40;</span>categories_id <span class="kw1">ASC</span><span class="br0">&#41;</span> ,<br />
&nbsp; &nbsp; CONSTRAINT fk_categories_description<br />
&nbsp; &nbsp; <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span>categories_id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">REFERENCES</span> categories_description <span class="br0">&#40;</span>categories_id<span class="br0">&#41;</span> ,</p>
<p>&nbsp; &nbsp; <span class="kw1">INDEX</span> fk_languages <span class="br0">&#40;</span>language_id <span class="kw1">ASC</span><span class="br0">&#41;</span> ,<br />
&nbsp; &nbsp; CONSTRAINT fk_languages<br />
&nbsp; &nbsp; <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span>language_id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">REFERENCES</span> languages <span class="br0">&#40;</span>languages_id<span class="br0">&#41;</span><br />
<span class="br0">&#41;</span> ENGINE=InnoDB <span class="kw1">DEFAULT</span> CHARSET=latin1;</div>
<p>Hier wurden lediglich 3 Fremdschlüssel ergänzt, weil die Joins der Abfrage über diese Fremdschlüssel verlaufen: fk_products_description, fk_categories_description und fk_languages.</p>
<p>Wichtig ist hierbei das Stichwort <strong>InnoDb</strong>. Das Verknüpfen der Tabellen mit Fremdschlüsseln funktioniert in MySQL nur mit der Storage-Engine <a href="http://www.innodb.com/">InnoDb</a>. Also müssen alle Tabellen, die verknüpft werden sollen vom Typ InnoDb sein. In phpMyAdmin kann man dies unter Operations ändern. Ansonsten einen ALTER TABLE Befehl auf die betreffenden Tabellen ausführe. Im Falle von der DirectUrl Optimierung wären das diese hier:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">ALTER</span> <span class="kw1">TABLE</span> products_description ENGINE=InnoDb;<br />
<span class="kw1">ALTER</span> <span class="kw1">TABLE</span> categories_description ENGINE=InnoDb;<br />
<span class="kw1">ALTER</span> <span class="kw1">TABLE</span> languages ENGINE=InnoDb;</div>
<p>Am saubersten ist es jedoch, die Struktur mit InnoDb neu zu erstellen und nachträglich die Datensätze mittels INSERTs einfügen.</p>
<p>So dann gehen wir noch kurz auf einen Fremdschlüsseleintrag in der Tabellenstruktur ein, hier nochmals ein Auszug aus der Struktur oben:</p>
<div class="dean_ch" style="white-space: wrap;">&nbsp; &nbsp; <span class="kw1">INDEX</span> fk_categories_description <span class="br0">&#40;</span>categories_id <span class="kw1">ASC</span><span class="br0">&#41;</span> ,<br />
&nbsp; &nbsp; CONSTRAINT fk_categories_description<br />
&nbsp; &nbsp; <span class="kw1">FOREIGN</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span>categories_id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">REFERENCES</span> categories_description <span class="br0">&#40;</span>categories_id<span class="br0">&#41;</span> ,</div>
<p>Mit INDEX wird einfach mal ein Index auf das betreffende Feld gesetzt, welches den Schlüssel für das Verknüpfen der Tabellen enthält. Mit einem CONSTRAINT hat man nun die Möglichkeit den Fremdschlüssel zu definieren. REFERENCES gibt hierbei an, in welcher Tabelle und welcher Spalte sich der Fremdschlüssel befindet. Befindet sich die Tabelle in einer anderen Datenbank, kann dies natürlich auch definiert werden. Der Name der Datenbank mit einem Punkt einfach vor dem Tabellennamen geschrieben: DBNAME.TABLENAME. In dem Beispiel ist also <em>categories_description</em> die Tabelle die wir über <em>categories_id</em> verknüpfen wollen. Also ist bluegate_seo_url.categories_id == categories_description.categories_id. Sollte dies bei einem Datensatz nicht der Fall sein, so erscheint eine Fehlermeldung. Mit den Relationen wird also zugleich für eine schöne Datenkonsistenz gesorgt.</p>
<p>PS: Indizes ist die Mehrzahl von Index.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webdesign-informatik.de/mysql/mysql-datenbank-tunen-mit-innodb-und-indizes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

