Inmiddels ben ik al een aantal maanden bezig met de optimalisatie van een MySQL query. Specifiek voor dit doel heb ik inmiddels MySQL 4.1 geinstalleerd, zodat ik ook subqueries tot m'n beschikking heb ... het lukt me alleen niet om op een slimme manier de juiste info uit de table te halen ... de huidige methode geeft query-tijden van meer dan een minuut als de data in de tabellen ook maar enigszins flink wordt.
Ten eerste de tabel-layout (in simpele vorm)
Het idee is dat alle objecten in m'n CMS zijn opgeslagen in deze objecten tabel, waarbij object-specifieke gegevens worden opgeslagen in tabellen die specifiek voor het type object zijn ingedeeld (pages, messages, images, etc). Door gebruik te maken van het left/right systeem kan ik heel makkelijk in 1 keer een hele "familie" van objecten uit de database halen.
Nu is het met het rechten-systeem zo geregeld, dat voor ieder object en per gebruiker/gebruikersgroep in een aparte tabel kan worden ingesteld of er bepaalde rechten (LEZEN/SCHRIJVEN/etc.) toegezegd of juist ontzegd worden, die tabel ziet er zo uit:
De rechten werken vervolgens hierarchisch, wat wil zeggen dat als er voor een bepaald object geen specifieke rechten zijn ingesteld, dat gelden automatisch de rechten van de PARENT van het betreffende object (en zo verder omhoog tot het TOPLEVEL object).
De kern van het probleem is dus om in 1 query alle objecten, inclusief hun PARENTS uit de tabel te halen. Vervolgens kan ik die informatie koppelen aan de rechten die al dan niet zijn ingesteld. De query die ik nu gebruik is als volgt:
Zoals je wellicht al aanvoelt duurt het veel te lang om die uit te voeren.
Ik heb geen flauw idee meer hoe ik het dan moet aanpakken.
Alvast heel veel dank voor alle tips en hulp.
Ten eerste de tabel-layout (in simpele vorm)
SQL:
1
2
3
4
5
6
7
8
| CREATE TABLE `cms_objects` ( `cms_objectID` int(11) NOT NULL auto_increment, `caption` varchar(255) NOT NULL default '', `parentID` int(11) NOT NULL default '0', `lft` int(11) NOT NULL default '0', `rgt` int(11) NOT NULL default '0', `depth` int(11) NOT NULL default '0' ) |
Het idee is dat alle objecten in m'n CMS zijn opgeslagen in deze objecten tabel, waarbij object-specifieke gegevens worden opgeslagen in tabellen die specifiek voor het type object zijn ingedeeld (pages, messages, images, etc). Door gebruik te maken van het left/right systeem kan ik heel makkelijk in 1 keer een hele "familie" van objecten uit de database halen.
Nu is het met het rechten-systeem zo geregeld, dat voor ieder object en per gebruiker/gebruikersgroep in een aparte tabel kan worden ingesteld of er bepaalde rechten (LEZEN/SCHRIJVEN/etc.) toegezegd of juist ontzegd worden, die tabel ziet er zo uit:
SQL:
1
2
3
4
5
6
7
| CREATE TABLE `cms_objects2operations` ( `cms_objectID` int(11) NOT NULL default '0', `auth_roleID` int(11) NOT NULL default '0', `auth_operationID` int(11) NOT NULL default '0', `value` int(2) NOT NULL default '0', PRIMARY KEY (`cms_objectID`,`auth_roleID`,`auth_operationID`) ) |
De rechten werken vervolgens hierarchisch, wat wil zeggen dat als er voor een bepaald object geen specifieke rechten zijn ingesteld, dat gelden automatisch de rechten van de PARENT van het betreffende object (en zo verder omhoog tot het TOPLEVEL object).
De kern van het probleem is dus om in 1 query alle objecten, inclusief hun PARENTS uit de tabel te halen. Vervolgens kan ik die informatie koppelen aan de rechten die al dan niet zijn ingesteld. De query die ik nu gebruik is als volgt:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| SELECT o1.cms_objectID, o2.cms_objectID, o2.depth, o1.* FROM cms_objects o1, cms_objects o2 WHERE o1.lft > o2.lft AND o1.rgt < o2.rgt AND o1.depth > o2.depth |
Zoals je wellicht al aanvoelt duurt het veel te lang om die uit te voeren.
Ik heb geen flauw idee meer hoe ik het dan moet aanpakken.
Alvast heel veel dank voor alle tips en hulp.