WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Nested class - mysql problem (https://www.wn.se/forum/showthread.php?t=1042071)

zilveer 2010-05-16 18:41

Nested class - mysql problem
 
Hejsan,
jag hittade en väldigt bra sida som beskriver Nested class, den kan hittas på http://sslim7.com/

Jag har skapat tabellen:

Kod:

CREATE TABLE nested_category (
 category_id INT AUTO_INCREMENT PRIMARY KEY,
 name VARCHAR(20) NOT NULL,
 lft INT NOT NULL,
 rgt INT NOT NULL
);

INSERT INTO nested_category
VALUES(1,'ELECTRONICS',1,20),(2,'TELEVISIONS',2,9),(3,'TUBE',3,4),
(4,'LCD',5,6),(5,'PLASMA',7,8),(6,'PORTABLE ELECTRONICS',10,19),
(7,'MP3 PLAYERS',11,14),(8,'FLASH',12,13),
(9,'CD PLAYERS',15,16),(10,'2 WAY RADIOS',17,18);

Jag vill t.ex. ha ut en "single path" via denna nested class.
Koden jag använder är:
Kod:

SELECT parent.name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = 'FLASH'
ORDER BY parent.lft;

+----------------------+
| name                |
+----------------------+
| ELECTRONICS          |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS          |
| FLASH                |
+----------------------+

Som ni ser så får jag ut sökvägen till Flash via alla överkategorier.

Men MySQL hanterar inte denna fråga som optimal, jag får ut följande via explain queryn:
Kod:


id        select_type        table        type        possible_keys        key        key_len        ref        rows        Extra
1        SIMPLE        node        ref        lft,name        name        62        const        1        Using where; Using temporary; Using filesort
1        SIMPLE        parent        ALL        lft        NULL        NULL        NULL        10        Range checked for each record (index map: 0x2)

Hur ska jag undvika "Using where; Using temporary; Using filesort" samt "Range checked for each record (index map: 0x2)"

Känns inte optimalt att använda nested class med MySQL, eller är det jag som missat något?
Tacksam för alla svar.
Mvh

studiox 2010-05-16 19:14

Vad är det som inte känns optimalt? MySQL är ju en relationsdatabas och för att få reda på en path måste man väl ta reda på alla RELATIONERNA? Eller hur hade du tänkt dig att det ska gå till annars?

zilveer 2010-05-16 19:18

Självklart vet jag att mysql är en relationsdatabas men kommer jag inte att få mysql_slow_queries av dessa förfrågningar?

vid EXPLAIN får jag ju
Kod:

Using where; Using temporary; Using filesort
känns inte riktigt optimalt.

Jonas 2010-05-17 01:08

Sätt upp korrekta index.

Enligt din CREATE TABLE så har du inga index.

zilveer 2010-05-17 13:43

Tack för svar,
men jag har skapat följande INDEX i efterhand:
Kod:

PRIMARY          PRIMARY          10            Edit            Drop            category_id
lft        INDEX        10          Edit        Drop        lft
rgt
name        INDEX        10          Edit        Drop        name



Alla tider är GMT +2. Klockan är nu 14:01.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson