Doppelter Index nach Änderung ?
In einer bestehenden db mySQL 4.0.18 mit Daten habe ich nachträglich folgendes wegen Performance-Steigerung geändert:
1.) Feld fixed auf "NOT NULL" gesetzt (enthielt vorher keinen Wert NULL)
2.) Feld fixed als zus. Index deklariert
3.) Feld pid als zus. Index deklariert
Benutzte Befehle:
ALTER TABLE `forum_entries` CHANGE `fixed` `fixed` TINYINT( 4 ) NOT NULL DEFAULT '0'
ALTER TABLE `forum_entries` ADD INDEX ( `fixed` )
ALTER TABLE `forum_entries` ADD INDEX ( `pid` )
Nun zeigt phpMyAdmin für die Struktur der Tabelle an, dass es zwei Indexe auf fixed gibt:
fixed und fixed_2
mit der Meldung:
Es sollte nicht mehr als ein Index des Typs INDEX für die Spalte `fixed` gesetzt sein.
Ferner zeigt das Explain des zu optimierenden Select-Statements
EXPLAIN SELECT id, pid, tid FROM forum_entries WHERE category = '2' AND pid = 0 ORDER BY fixed DESC LIMIT 30
weiterhin an, dass immer noch ein filesort benutzt wird (unter Extra), obwohl id, pid, tid, category und fixed Indizes sind. Genau wegen des "Using filesort" habe ich den Index auf fixed gesetzt.
Warum dieser Aufwand: ich möchte die letzten n=30 Threads aus einem Forum selektieren inkl. denen, die "fixed" sind, also oben stehen sollen. Anzahl Postings = 50.000, Anzahl user = ca. 100. Daher der Aufwand für eine Optimierung. Sieht jemand eine schnellere Abfrage für diesen Zweck?
Kann mir als mySQL-Novize jemand einen Hinweis geben, was ich falsch gemacht habe?
Danke für jede Bemühung.
Bodo
PS: Hier der Dump nach der Änderung, der den Fehler zeigt (fixed und fixed_2), ich möchte nicht die ganze Tabelle löschen und neu anlegen:
CREATE TABLE `forum_entries` (
`id` int(11) NOT NULL auto_increment,
`pid` int(11) NOT NULL default '0',
`tid` int(11) NOT NULL default '0',
`uniqid` tinytext NOT NULL,
`time` timestamp(14) NOT NULL,
`last_answer` timestamp(14) NOT NULL default '00000000000000',
`edited` timestamp(14) NOT NULL default '00000000000000',
`edited_by` tinytext NOT NULL,
`user_id` int(11) default '0',
`name` tinytext NOT NULL,
`subject` tinytext NOT NULL,
`category` int(11) NOT NULL default '0',
`email` tinytext NOT NULL,
`hp` tinytext NOT NULL,
`place` tinytext NOT NULL,
`ip` tinytext NOT NULL,
`text` text NOT NULL,
`show_signature` tinyint(4) default '0',
`email_notify` tinyint(4) default '0',
`marked` tinyint(4) default '0',
`locked` tinyint(4) default '0',
`fixed` tinyint(4) NOT NULL default '0',
`views` int(11) default '0',
PRIMARY KEY (`id`),
KEY `tid` (`tid`),
KEY `category` (`category`),
KEY `fixed` (`fixed`),
KEY `fixed_2` (`fixed`),
KEY `pid` (`pid`)
) TYPE=MyISAM AUTO_INCREMENT=12647 ;
Geändert von lod_bodo (06.03.2006 um 21:36:15 Uhr)
|