>How-To-Repeat:

drop table if exists t1;
create table t1 (
  e enum('N', 'Y') not null,
  i int not null,
  c1 char(255), c2 char(255), c3 char(255), c4 char(255),
  c5 char(255), c6 char(255), c7 char(255), c8 char(255),
  primary key (e, i)
);
insert into t1 (e, i) values
  ('N', 1), ('Y', 2), ('N', 3), ('Y', 3), ('Y', 4), ('N', 6),
  ('Y', 6), ('N', 7), ('Y', 7), ('Y', 8), ('N', 9), ('Y', 9);
explain select * from t1 where i in (2, 5, 7);
explain select * from t1 where i in (2, 5, 7) and e in ('', 'N', 'Y');

>Release:       mysql-4.0.3-beta (Source distribution)
>Description:

Both selects (without explain) return exactly the same because e is
enum('N', 'Y'), but the first one uses the index, the second doesn't:

explain select * from t1 where i in (2, 5, 7);
table  type  possible_keys  key     key_len ref   rows  Extra
t1     ALL   NULL           NULL    NULL    NULL  12    where used

explain select * from t1 where i in (2, 5, 7) and e in ('', 'N', 'Y');
table  type  possible_keys  key     key_len ref   rows  Extra
t1     range PRIMARY        PRIMARY 5       NULL  9     where used

It is well documented in the chapter "MySQL Optimisation" that the
first select doesn't use the index:

"If you are _always_ using many columns, you should use the column
with more duplicates first to get better compression of the index."

"Any index that doesn't span all AND levels in the WHERE clause is not
used to optimise the query."

But I think it is a good idea to make MySQL more intelligent when
choosing an index so that it uses the index in the first select as
well.

Regards

  Julian


---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to