Hi, I'm not sure I understand indexes properly.

In this EXPLAIN, I expected the Cls (Classes) table to be of type ref with
the key being ObjectID. I'm joining both identically as far as I can tell,
on one of the columns in the primary key, which is set to a key itself, but
Cls is joining on ALL. Why is it doing that?

Has it got something to do with the way my query is worded?

Thanks in advance,
Chris

=EXPLAIN===================================================================
+---------+--------+------------------+----------+---------+-------------------------------------+------+---------------------------
-------------------+
| table   | type   | possible_keys    | key      | key_len | ref                       
          | rows | Extra
|
+---------+--------+------------------+----------+---------+-------------------------------------+------+---------------------------
-------------------+
| NPCSpl  | index  | PRIMARY          | PRIMARY  |      10 | NULL                      
          | 6034 | Using index; Using
temporary; Using filesort |
| ObjNPCs | eq_ref | PRIMARY          | PRIMARY  |       8 | 
const,NPCSpl.FileID,NPCSpl.ObjectID |    1 | Using where; Using index
|
| NPCs    | eq_ref | PRIMARY,ObjectID | PRIMARY  |       6 | 
ObjNPCs.FileID,ObjNPCs.ObjectID     |    1 |
|
| Spl     | ref    | PRIMARY,ObjectID | ObjectID |       4 | NPCSpl.ObjectID_Spell     
          |   15 |
|
| ObjSpl  | eq_ref | PRIMARY          | PRIMARY  |       8 | 
const,Spl.FileID,Spl.ObjectID       |    1 | Using where; Using index
|
| Cls     | ALL    | PRIMARY,ObjectID | NULL     |    NULL | NULL                      
          |   84 | Using where
|
| ObjCls  | eq_ref | PRIMARY          | PRIMARY  |       8 | 
const,Cls.FileID,Cls.ObjectID       |    1 | Using where; Using index
|
+---------+--------+------------------+----------+---------+-------------------------------------+------+---------------------------
-------------------+


=QUERY=====================================================================
SELECT
  NPCs.FileID,
  NPCs.ObjectID,
  NPCs.Name,
  Spl.FileID as FileID_Spell,
  Spl.ObjectID as ObjectID_Spell,
  Spl.Name as Name_Spell
FROM NPCs
JOIN GroupedObjects ObjNPCs
  ON
  (
    1=ObjNPCs.GroupID
    AND
    NPCs.FileID=ObjNPCs.FileID
    AND
    NPCs.ObjectID=ObjNPCs.ObjectID
  )
JOIN NPCSpells NPCSpl
  ON
  (
    ObjNPCs.FileID=NPCSpl.FileID
    AND
    ObjNPCs.ObjectID=NPCSpl.ObjectID
  )
JOIN Spells Spl
  ON
  (
    Spl.ObjectID=NPCSpl.ObjectID_Spell
  )
INNER JOIN GroupedObjects ObjSpl
  ON
  (
    1=ObjSpl.GroupID
    AND
    Spl.FileID=ObjSpl.FileID
    AND
    Spl.ObjectID=ObjSpl.ObjectID
  )
JOIN Classes Cls
  ON
  (
    Cls.ObjectID=NPCs.ObjectID_Class
  )
INNER JOIN GroupedObjects ObjCls
  ON
  (
    1=ObjCls.GroupID
    AND
    Cls.FileID=ObjCls.FileID
    AND
    Cls.ObjectID=ObjCls.ObjectID
  )
WHERE
  2048 & NPCs.Services
  OR
  2048 & Cls.Services
ORDER BY
  NPCs.ObjectID;

=TABLES====================================================================
CREATE TABLE `Spells` (
  `FileID` smallint(5) unsigned NOT NULL default '0',
  `ObjectID` int(10) unsigned NOT NULL default '0',
  `Name` char(32) default NULL,
  `SpellTypeID` tinyint(4) NOT NULL default '0',
  `Cost` int(11) NOT NULL default '0',
  `Flags`
set('0x1','0x2','0x4','0x8','0x10','0x20','0x40','0x80','0x100','0x200','0x400','0x800','0x1000','0x2000','0x4000','0x8000','0x10000
','0x20000','0x40000','0x80000','0x100000','0x200000','0x400000','0x800000','0x1000000','0x2000000','0x4000000','0x8000000','0x10000
000','0x20000000','0x40000000','0x80000000') NOT NULL default '',
  PRIMARY KEY  (`FileID`,`ObjectID`),
  KEY `ObjectID` (`ObjectID`)
) TYPE=MyISAM COMMENT='Spells'


CREATE TABLE `Classes` (
  `FileID` smallint(5) unsigned NOT NULL default '0',
  `ObjectID` int(10) unsigned NOT NULL default '0',
  `Name` varchar(32) NOT NULL default '',
  `AttrID_Pri0` tinyint(4) NOT NULL default '0',
  `AttrID_Pri1` tinyint(4) NOT NULL default '0',
  `SpecID` tinyint(4) NOT NULL default '0',
  `SkillID_Maj0` tinyint(3) unsigned NOT NULL default '0',
  `SkillID_Maj1` tinyint(3) unsigned NOT NULL default '0',
  `SkillID_Maj2` tinyint(3) unsigned NOT NULL default '0',
  `SkillID_Maj3` tinyint(3) unsigned NOT NULL default '0',
  `SkillID_Maj4` tinyint(3) unsigned NOT NULL default '0',
  `SkillID_Min0` tinyint(3) unsigned NOT NULL default '0',
  `SkillID_Min1` tinyint(3) unsigned NOT NULL default '0',
  `SkillID_Min2` tinyint(3) unsigned NOT NULL default '0',
  `SkillID_Min3` tinyint(3) unsigned NOT NULL default '0',
  `SkillID_Min4` tinyint(3) unsigned NOT NULL default '0',
  `Flags`
set('Playable','0x2','0x4','0x8','0x10','0x20','0x40','0x80','0x100','0x200','0x400','0x800','0x1000','0x2000','0x4000','0x8000','0x
10000','0x20000','0x40000','0x80000','0x100000','0x200000','0x400000','0x800000','0x1000000','0x2000000','0x4000000','0x8000000','0x
10000000','0x20000000','0x40000000','0x80000000') NOT NULL default '',
  `Services` 
set('Weapons','Armor','Clothing','Books','Ingredients','Picks','Probes','Lights','Apparatus','Repair
Items','Miscellaneous','Spells','Magic 
Items','Potions','Training','Spellmaking','Enchanting','Repair') default NULL,
  `Description` text,
  PRIMARY KEY  (`FileID`,`ObjectID`),
  KEY `ObjectID` (`ObjectID`)
) TYPE=MyISAM COMMENT='Classes'


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to