On Thu, 26 Feb 2004, Keith Thompson wrote:

> Given these two tables:
>
>     create table t1 (
>        id int unsigned auto_increment,
>        a int,
>        ... [other fields]
>        primary key (id),
>        index aid (a,id)
>     ) type=innodb;
>
>     create table t2 (
>        id int unsigned,
>        b int,
>        ... [other fields]
>        index id (id),
>        index bid (b,id)
>     ) type=innodb;
>
> Using searches of the form:
>    select *
>    from t1, t2
>    where t1.id = t2.id
>    and t1.a = somevalue
>    and t2.b = somevalue
>
> Now, let's say that the data is such that the driving table is t2
> (order of tables with EXPLAIN is t2, t1).
>
> Can MySQL take advantage of the "bid" index to retrieve the id
> for the join out of the index rather than pulling the data row,
> or is there no advantage to using "index bid (b,id)" over just
> using "index bid (b)" for this query?

Sure, it can do that.

>
> Similarly, can MySQL use "aid" for this query to satisfy both the
> join and the "t1.a = somevalue" comparison together when t1 is
> not the driving table like this?  It appears to only want to use
> the primary key for t1 for this query, which leads me to believe
> that on non-driving tables the only index it can use is one to do
> the join and that it can't use an index that could satisfy both
> the join and another field comparison at the same time.

When I just created your test tables with no extra columns, explain
shows it didn't want to use the multicolumn index on the second
table (ie. "using index") unless I explicitly did a force index,
but then it did so just fine:

mysql> explain select * from t1, t2 force index(bid) where t1.id = t2.id and t1.a= 
'xxx' and t2.b = 'yy' \G
*************************** 1. row ***************************
        table: t1
         type: ref
possible_keys: PRIMARY,aid
          key: aid
      key_len: 5
          ref: const
         rows: 1
        Extra: Using where; Using index
*************************** 2. row ***************************
        table: t2
         type: ref
possible_keys: bid
          key: bid
      key_len: 10
          ref: const,t1.id
         rows: 1
        Extra: Using where; Using index
2 rows in set (0.00 sec)

It may well change its perspective and decide to use the index automatically
if I actually had more columns in the table, or had data in it, but I
don't know offhand if it is smart enough for that...

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

Reply via email to