[ MyCoRe Home ] [ Dokumentation ] [ HowTo ] [ Datenbankindizes ]
Wichtige Datenbank-Indizes zum Beschleunigen der Datenbankanfragen
- Bei großen Datenbeständen kann es sinnvoll sein, Indizes auf der Datenbank setzen, so dass häufige Anfragen schneller ausgeführt werden können. Wie die Indizes gesetzt werden ist von Datenbanksystem zu Datenbanksystem verschieden. Es werden zunächst die Index-Kommandos für DB2 genannt, für andere Datenbanken ist die Syntax leicht anzupassen:
DB2
IFS beschleunigen
Zuerst eine Verbindung zur Datenbank herstellen: db2 connect to dbname
wobei dbname durch den Datenbanknamen zu ersetzen ist.
Um den Zugriff auf Root-Knoten im IFS zu beschleunigen:
dbname ersetzen durch den eigenen Datenbanknamen und MCRFSNODES ersetzen durch den eigenen Tabellennamen. Diesen erfragen mit db2 list tables.
db2 connect to dbname db2 "CREATE INDEX RootNodes ON MCRFSNODES (PID ASC, OWNER ASC, ID ASC) ALLOW REVERSE SCANS" db2 connect reset
Um den Zugriff auf Kindknoten zu beschleunigen:
db2 connect to dbname db2 "CREATE INDEX ChildNodes ON MCRFSNODES (PID ASC, NAME DESC) ALLOW REVERSE SCANS" db2 connect reset
Klassifikationssystem beschleunigen
Achtung
Dieser Abschnitt bezieht sich auf das Klassifikatinssystem, dass im Release 2 eingesetzt werden soll.
Das Zählen von Objekten in einer Klassifikation lässt sich mit folgenden Aufrufen beschleunigen:
db2 connect to dbname db2 "CREATE INDEX RightLeft ON MCRCATEGORY (CLASSID ASC, RIGHTVALUE ASC, LEFTVALUE ASC, INTERNALID ASC, CATEGID ASC) ALLOW REVERSE SCANS" db2 "CREATE UNIQUE INDEX ClassLeftUnique ON MCRCATEGORY (INTERNALID ASC) INCLUDE (CLASSID, LEFTVALUE) ALLOW REVERSE SCANS" db2 "CREATE INDEX Categories ON MCRCATEGORYLINK (CATEGORY ASC) ALLOW REVERSE SCANS" db2 "CREATE INDEX ObjectIDs ON MCRCATEGORYLINK (OBJECTID ASC) ALLOW REVERSE SCANS" db2 connect reset
Anschließend die Verbindung zur Datenbank beenden: db2 terminate
HSQLDB
Generell sieht die Syntax bei HSQLDB ähnlich aus, allerdings muss man ALLOW REVERSE SCANS am Ende weglassen, z. B.
Der Index ClassLeftUnique muss bei HSQLDB anders als unter DB2 erstellt werden:
CREATE UNIQUE INDEX ClassLeftUnique ON MCRCATEGORY (INTERNALID ASC, CLASSID ASC, LEFTVALUE ASC)
MySQL
CREATE INDEX RightLeft ON MCRCategory (CLASSID ASC, RIGHTVALUE ASC, LEFTVALUE ASC, INTERNALID ASC, CATEGID ASC); CREATE INDEX ClassLeftUnique ON MCRCategory (INTERNALID ASC, CLASSID ASC, LEFTVALUE ASC); CREATE INDEX Categories ON MCRCategoryLink (CATEGORY ASC);
Materialised View
Unter MySQL ist es darüber hinaus notwendig, eine zusätzliche Hilfs-Tabelle parents anzulegen, um die Berechnung der Beziehung Vater-Kind-Enkelkind aus der Tabelle MCRCategory zu beschleunigen. Eine solche Berechnung wird oft bei Suchanfragen zur Zählung der Kategorien benötigt und ist unter MySQL inakzeptabel. Die spezielle Tabelle ist ein sogenannter Materialised View und wird wie folgt definiert:
CREATE TABLE parents SELECT p.ClassID AS ClassID, p.CategID AS parentCategID, c.internalID AS childID FROM MCRCategory p JOIN MCRCategory c ON p.classID = c.classID WHERE c.leftValue BETWEEN p.leftValue AND p.rightValue
Die SQL-Abfrage füllt die Tabelle parents direkt mit Werten aus MCRCategory und berechnet damit den Zwischenschritt, der später zu einer enormen Zeitersparnis führt. Ein Index auf parents steigert die Performanz weiter:
CREATE INDEX ctop ON parents (childID);
Um die Tabelle parents aktuell zu halten, sind weiterhin die nachfolgenden Trigger zu integrieren:
-- INSERT TRIGGER erzeugen:
--
DELIMITER |
DROP TRIGGER mcrcat_ins |
CREATE TRIGGER mcrcat_ins AFTER INSERT
ON MCRCategory
FOR EACH ROW
BEGIN
INSERT INTO parents
SELECT p.ClassID, p.CategID, c.internalID
FROM MCRCategory p
JOIN MCRCategory c
ON c.classID = p.classID
WHERE NEW.classID = c.classID AND c.internalID = NEW.internalID AND c.leftValue BETWEEN p.leftValue AND p.rightValue;
END; |
DELIMITER ;
-- DELETE TRIGGER erzeugen:
--
DELIMITER |
DROP TRIGGER mcrcat_del |
CREATE TRIGGER mcrcat_del AFTER DELETE
ON MCRCategory
FOR EACH ROW
BEGIN
DELETE FROM parents WHERE OLD.internalID = childID;
END; |
DELIMITER ;
-- UPDATE TRIGGER erzeugen:
--
DELIMITER |
DROP TRIGGER mcrcat_upd |
CREATE TRIGGER mcrcat_upd AFTER UPDATE
ON MCRCategory
FOR EACH ROW
BEGIN
DELETE FROM parents WHERE OLD.internalID = childID;
INSERT INTO parents
SELECT p.ClassID, p.CategID, c.internalID
FROM MCRCategory p
JOIN MCRCategory c
ON c.classID = p.classID
WHERE NEW.classID = c.classID AND c.internalID = NEW.internalID AND c.leftValue BETWEEN p.leftValue AND p.rightValue;
END; |
DELIMITER ;Unterschiede in verschiedenen MySQL-Versionen:
- In MySQL vor Version 5 existiert das Feature 'Trigger' nicht
- In MySQL Version 5 benötigt man das SUPER Privileg für die Nutzung. Man benötigt also die Mithilfe des Administrators der Installation
GRANT SUPER ON *.* TO mcradmin@'%';
- Ab MySQL Version 5.1 reicht das TRIGGER Privileg für die Nutzung.
Achtung:
- Um die Nutzung dieser Tabelle zu aktivieren, muss das folgende Property gesetzt sein:
MCR.Hibernate.DialectQueries=true
Kommentar