Dit komt eigenlijk uit een ander topic van gisteren, maar ik heb er nu een nieuwe vraag over:
SELECT node.* FROM node, relation WHERE relation.child_id = node.id AND relation.parent_id = 1
Ik heb een twee-koloms index gemaakt (genaamd parent_child) op de relation-table, met parent_id en child_id als kolommen.
De EXPLAIN resultaten van de query geven een read order weer van 1. relation, 2. node. De read op relation maakt gebruik van m'n key, is van type 'ref' (wat volgens de manual goed is, aangezien er niet echt veel matches zullen zijn per query?). De read op node is van type ALL (niet goed), gebruikt geen key. Dit is een redelijk stukje geoptimaliseerd, daar het aantal te scannen relations drastisch afneemt vanwege het gebruik van de index. Maar hij moet steeds ALLe nodes langs fietsen, (using where) Het heeft schijnbaar geen zin om naast de PRIMARY een extra index te bouwen op node.id, het blijft ALL.
Maak ik de query als volgt:
SELECT node.* FROM node, relation WHERE relation.child_id = node.id AND relation.parent_id = 1 ORDER BY node.object_id ASC, node.name ASC
(want dat wil ik nou eenmaal)
dan krijg ik ineens een andere read-volgorde: node, relation. De read op node word nog 'duurder', want hij doet een file-sort (die krijg ik ook niet weg, wat voor indices ik ook op object_id en name zet). Maar de read op relation word ook ineens anders. Waar de 'ref' column in het EXPLAIN resultaat in het eerste geval 'const' was, is het nu 'const, node.id' en het aantal rows dattie moet examinen is nog lager.
Vragen:
Is er nou echt geen mogelijkheid om de node tabel dusdanig te indexeren dat die voor deze queries niet de hele node tabel door hoeft te fietsen?
Wat betekent nou dat 'const, node.id'? Ik heb nu (als test) een relation tabel met 9 records, waarvan er 3 matchen aan bovenstaande queries. In de eerste query had ik in het EXPLAIN resultaat 3 examined rows, in de tweede query 1 examined row. Hoe moet ik dit nou precies rijmen?
Ik las ergens dat het indexeren van columns waarop gesorteerd moet worden ook kan helpen. Ik krijg echter geen resultaten. Hoe zit dat dan precies?
Ook al zijn er meerdere parents per node, over het algemeen loop ik de tree hierarchisch naar beneden af (behalve op de huidig door de user geselecteerde node). De query voor het verkrijgen van de child nodes op de node 'root' (id=1), is aldus:Ik ben bezig met het (her-)schrijven van wat ik mijn 'hypertree' noem. Kort gezegd is het een soort boomstructuur waarbij elke 'node' niet alleen meedere 'childnodes' kan hebben, maar ook meerdere 'parentnodes'. Bijbehorende (SQL-) databasestructuur bevat aldus een node tabel (id, name) en een relation tabel (id, parent_id, child_id).
SELECT node.* FROM node, relation WHERE relation.child_id = node.id AND relation.parent_id = 1
Ik heb een twee-koloms index gemaakt (genaamd parent_child) op de relation-table, met parent_id en child_id als kolommen.
De EXPLAIN resultaten van de query geven een read order weer van 1. relation, 2. node. De read op relation maakt gebruik van m'n key, is van type 'ref' (wat volgens de manual goed is, aangezien er niet echt veel matches zullen zijn per query?). De read op node is van type ALL (niet goed), gebruikt geen key. Dit is een redelijk stukje geoptimaliseerd, daar het aantal te scannen relations drastisch afneemt vanwege het gebruik van de index. Maar hij moet steeds ALLe nodes langs fietsen, (using where) Het heeft schijnbaar geen zin om naast de PRIMARY een extra index te bouwen op node.id, het blijft ALL.
Maak ik de query als volgt:
SELECT node.* FROM node, relation WHERE relation.child_id = node.id AND relation.parent_id = 1 ORDER BY node.object_id ASC, node.name ASC
(want dat wil ik nou eenmaal)
dan krijg ik ineens een andere read-volgorde: node, relation. De read op node word nog 'duurder', want hij doet een file-sort (die krijg ik ook niet weg, wat voor indices ik ook op object_id en name zet). Maar de read op relation word ook ineens anders. Waar de 'ref' column in het EXPLAIN resultaat in het eerste geval 'const' was, is het nu 'const, node.id' en het aantal rows dattie moet examinen is nog lager.
Vragen:
Is er nou echt geen mogelijkheid om de node tabel dusdanig te indexeren dat die voor deze queries niet de hele node tabel door hoeft te fietsen?
Wat betekent nou dat 'const, node.id'? Ik heb nu (als test) een relation tabel met 9 records, waarvan er 3 matchen aan bovenstaande queries. In de eerste query had ik in het EXPLAIN resultaat 3 examined rows, in de tweede query 1 examined row. Hoe moet ik dit nou precies rijmen?
Ik las ergens dat het indexeren van columns waarop gesorteerd moet worden ook kan helpen. Ik krijg echter geen resultaten. Hoe zit dat dan precies?