Maybe I'm missing something here--I don't know of a way to create an index
on TWO tables at once? Also, when I do:

EXPLAIN SELECT log.entity, log.action,
  LEFT(users.username,10) AS username,
  LEFT(boards.title,15) AS Board,
  LEFT(topics.subject,22) as Subject,
  log.postid, log.extraid,
  LEFT(from_unixtime(log.logtime),19) AS time, log.ip
FROM log LEFT JOIN users ON log.userid = users.id
  LEFT JOIN boards ON log.boardid=boards.id
  LEFT JOIN topics ON log.topicid = topics.id
WHERE users.username="testuser";

(users.username is indexed), I get the following:

+--------+--------+---------------+---------+---------+-------------+-------
--+------------+
| table  | type   | possible_keys | key     | key_len | ref         | rows
| Extra      |
+--------+--------+---------------+---------+---------+-------------+-------
--+------------+
| log    | ALL    | NULL          | NULL    |    NULL | NULL        |
1199187 |            |
| users  | eq_ref | PRIMARY       | PRIMARY |       4 | log.userId  |
1 | where used |
| boards | eq_ref | PRIMARY       | PRIMARY |       4 | log.boardId |
1 |            |
| topics | eq_ref | PRIMARY       | PRIMARY |       4 | log.topicId |
1 |            |
+--------+--------+---------------+---------+---------+-------------+-------
--+------------+
4 rows in set (0.00 sec)

It's just simply not using the index on users.. Did I miss something?

David

----- Original Message -----
From: "Bill Adams" <[EMAIL PROTECTED]>
To: "David Wolf" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Monday, October 29, 2001 9:21 AM
Subject: Re: Optimizing query (2nd attempt)


> David Wolf wrote:
>
> >Not quite fixed.. When I run the query without limiting by time, it still
> >fails to use the userid key. i.e. if I only select where
> >users.username="testuser", I'd expect that users.username to return the
> >users.id=2, and to search using the indexed log.userid=2
>
>
> MySQL can only use one index on a table at a time.  It also uses the
columns in
> the order in which they are defined.  ORDER MATTERS!
>
> The manual does not seem to cover this, but at least Informix will stop
using
> an index when an inequality is hit.  E.g.: if you have an index on (a, b,
c )
> and the query has WHERE a=5 AND b>2 AND c=10, the only part of the index
that
> will be used is (a, b).  (Monty & co, is this true with MySQL? Can you add
> something to the manual either way?)
>
> So assuming this is true in your where clause:
>
> > WHERE log.logTime > UNIX_TIMESTAMP("2000-10-26 23:00:00")
> >   AND users.username="testuser";
>
> If you have an index on ( logTime, username), since you have an inequality
for
> lotTime in the query, username will NOT be used.  However if you have the
index
> on (username, logTime)  --or even just the first 10 chars or so of
username +
> logTime-- then both username AND logTime will be used in the index.
>
> You may want to try this to see if it makes any difference.
>
> And, of course, run myisamchk -a on the tables after you build indexes.



---------------------------------------------------------------------
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