I have a table structured like so:
CREATE TABLE `foo_equivalency` (
`foo_id` smallint(6) NOT NULL default '0',
`type` enum('a_id','b_id','foo_id') NOT NULL default 'foo_id',
`id` smallint(6) NOT NULL default '0',
KEY `foo_id` (`foo_id`),
KEY `type` (`type`)
) TYPE=MyISAM
I'm using a SELECT to pull all of the equivalent foo_id's
from another table, bar, like so:
SELECT bar.foo_id, foo_equivalency.foo_id FROM bar, foo_equivalency
WHERE
foo_equivalency.foo_id IN (367,365,327,269,197,387,379,361,331) AND
(type = 'a_id' and id = bar.a_id) OR
(type = 'b_id' and id = bar.b_id) OR
(type = 'foo_id' and id = bar.foo_id)
foo_id is a primary key in table bar, and I created test
indexes on a_id and b_id:
PRIMARY KEY (`foo_id`),
KEY `a_id` (`a_id`),
KEY `b_id` (`b_id`)
EXPLAIN reveals that no indexes are being used:
+-----------------+------+-------------------+------+---------+------+------
+-------------+
| table | type | possible_keys | key | key_len | ref | rows
| Extra |
+-----------------+------+-------------------+------+---------+------+------
+-------------+
| bar | ALL | PRIMARY,a_id,b_id | NULL | NULL | NULL | 269
| |
| foo_equivalency | ALL | foo_id,type | NULL | NULL | NULL | 2931
| Using where |
+-----------------+------+-------------------+------+---------+------+------
+-------------+
I'm unclear as to why none of the indexes apply, not even
the PRIMARY on foo_id. Is it the ORs that blow everything
away? Can I work around it?
It occurs to me that I could split foo_equivalency into 3
tables (foo_equivalency_by_a, foo_equivalency_by_b, and
foo_equivalency_by_foo), rather than using the enum and a
conditional, but that seems really unwieldy and slow (3
selects and then a UNION). Suggestions? I'm on MySQL 4.0.18,
by the way, so subselects aren't an option.
____________________________________________________________
Eamon Daly
NextWave Media Group LLC
Tel: 1 773 975-1115
Fax: 1 773 913-0970
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]