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