Contenido-Setup erzeugt doppelte u. überflüssige Indizes
Verfasst: Di 29. Jun 2004, 13:21
Hallo!
Mir ist beim Betrachten der von Contenido erzeugten Datenbank-Tabellen aufgefallen, daß bei manchen Tabellen doppelte und dreifache Indizes, teils auch überflüssige Indizes vorhanden sind.
Indizes beschleunigen den Zugriff auf Daten, verlangsamen aber das Einfügen, Ändern und Löschen von Daten, und kosten zusätzlichen Festplatten-Speicher, daher sollten unnötige Indizes vermieden werden.
z.B. bei der Tabelle con_art:
Das Feld 'idart' Primärschlüssel, ist daher schon indiziert, jedoch wurde dafür noch ein Index angelegt, der auch noch doppelt (idart,idart_2) ist.
Ebenso existieren für das Feld idclient auch 2 gleiche Indizes.
Bei con_keywords tritt ein anderer Fall auf:
Für das Feld 'keyword' existieren wieder 2 indizes, die Indizes 'idlang' und 'idlang_2' sind auch doppelt, und auch beide überflüssig, denn bei einem SQL-Befehl wie "SELECT * FROM con_keywords WHERE idlang=123" kann MySQL auch auf den Index idlang2 zugreifen.
Ein 3. Beispiel für überflüssige Indizes ist die Tabelle con_mod:
Die Indizes idclient_3 und idmod sind wieder überflüssig, da doppelt.
Ebenso ist idclient_2 unnötig, es sortiert die Tabelle nach dem Feld idmod, bei Einträgen mit gleichen idmod-Werten nach dem Feld idclient.
Es können aber keine gleichen idmod-Werte existieren, da idmod bereits Primärschlüssel ist, somit ist das 2. Feld des Index überflüssig, kann also gelöscht werden. Löscht man es, so hat man wieder einen Index für das Feld 'idmod' alleine, welcher auch wieder überflüssig ist, da für idmod schon der Primärschlüsselindex existiert.
Ich hoffe, ich hab es verständlich genug erklärt.
Ich bin dabei, ein PHP-Script zu schreiben, das solche überflüssigen Indizes erkennt und löscht.
mit freundlichen Grüßen
Egon Schmid
Mir ist beim Betrachten der von Contenido erzeugten Datenbank-Tabellen aufgefallen, daß bei manchen Tabellen doppelte und dreifache Indizes, teils auch überflüssige Indizes vorhanden sind.
Indizes beschleunigen den Zugriff auf Daten, verlangsamen aber das Einfügen, Ändern und Löschen von Daten, und kosten zusätzlichen Festplatten-Speicher, daher sollten unnötige Indizes vermieden werden.
z.B. bei der Tabelle con_art:
Code: Alles auswählen
--
-- Tabellenstruktur für Tabelle `con_art`
--
CREATE TABLE `con_art` (
`idart` int(10) NOT NULL default '0',
`idclient` int(10) NOT NULL default '0',
PRIMARY KEY (`idart`),
KEY `idart` (`idart`),
KEY `idclient` (`idclient`),
KEY `idart_2` (`idart`),
KEY `idclient_2` (`idclient`)
) TYPE=MyISAM;
Ebenso existieren für das Feld idclient auch 2 gleiche Indizes.
Bei con_keywords tritt ein anderer Fall auf:
Code: Alles auswählen
--
-- Tabellenstruktur für Tabelle `con_keywords`
--
CREATE TABLE `con_keywords` (
`idkeyword` int(10) NOT NULL default '0',
`keyword` varchar(50) NOT NULL default '',
`exp` text NOT NULL,
`auto` text NOT NULL,
`self` text NOT NULL,
`idlang` int(10) NOT NULL default '0',
PRIMARY KEY (`idkeyword`),
KEY `keyword` (`keyword`),
KEY `idlang` (`idlang`),
KEY `idlang2` (`idlang`,`keyword`),
KEY `keyword_2` (`keyword`),
KEY `idlang_2` (`idlang`)
) TYPE=MyISAM;
Ein 3. Beispiel für überflüssige Indizes ist die Tabelle con_mod:
Code: Alles auswählen
--
-- Tabellenstruktur für Tabelle `con_mod`
--
CREATE TABLE `con_mod` (
`idmod` int(10) NOT NULL default '0',
`idclient` int(10) NOT NULL default '0',
`name` varchar(255) NOT NULL default '',
`description` text,
`deletable` tinyint(1) default NULL,
`input` longtext NOT NULL,
`output` longtext NOT NULL,
`template` text NOT NULL,
`static` tinyint(1) NOT NULL default '0',
`author` varchar(32) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`lastmodified` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`idmod`),
KEY `idclient` (`idclient`),
KEY `idclient_2` (`idmod`,`idclient`),
KEY `idmod` (`idmod`),
KEY `idclient_3` (`idclient`)
) TYPE=MyISAM;
Ebenso ist idclient_2 unnötig, es sortiert die Tabelle nach dem Feld idmod, bei Einträgen mit gleichen idmod-Werten nach dem Feld idclient.
Es können aber keine gleichen idmod-Werte existieren, da idmod bereits Primärschlüssel ist, somit ist das 2. Feld des Index überflüssig, kann also gelöscht werden. Löscht man es, so hat man wieder einen Index für das Feld 'idmod' alleine, welcher auch wieder überflüssig ist, da für idmod schon der Primärschlüsselindex existiert.
Ich hoffe, ich hab es verständlich genug erklärt.
Ich bin dabei, ein PHP-Script zu schreiben, das solche überflüssigen Indizes erkennt und löscht.
mit freundlichen Grüßen
Egon Schmid