Michael,
"Stembridge, Michael" wrote:
>
>
> Finally, I ran an EXPLAIN SELECT on my main query. (fyi, ticketid 1 has a
> noteid of 1)
>
> EXPLAIN SELECT
> call_notes.call_elapsed,
> call_notes.call_seconds,
> call_notes.call_start,
> call_notes.call_end,
> call_notes_text.note_text,
> users.username,
> users.namefirst,
> users.email,
> facility_contact.contactid,
> facility_contact.contact
> FROM
> call_notes,
> call_notes_text,
> users,
> facility_contact
> WHERE
> call_notes.ticketid = '1' &&
> call_notes.userid = users.userid &&
> call_notes.contactid = facility_contact.contactid &&
> call_notes_text.noteid = call_notes.noteid
> ORDER BY
> call_notes.call_start DESC;
>
> +------------------+--------+-------------------------+---------+---------+-
> -----------------------+-------+---------------------------------+
> | table | type | possible_keys | key | key_len |
> ref | rows | Extra |
> +------------------+--------+-------------------------+---------+---------+-
> -----------------------+-------+---------------------------------+
> | call_notes_text | ALL | PRIMARY,noteid,noteid_2 | NULL | NULL |
> NULL | 14682 | Using temporary; Using filesort |
> | call_notes | eq_ref | PRIMARY,noteid,noteid_2 | PRIMARY | 4 |
> call_notes_text.noteid | 1 | where used |
> | users | eq_ref | PRIMARY,userid | PRIMARY | 4 |
> call_notes.userid | 1 | |
> | facility_contact | eq_ref | PRIMARY,contactid | PRIMARY | 4 |
> call_notes.contactid | 1 | |
> +------------------+--------+-------------------------+---------+---------+-
> -----------------------+-------+---------------------------------+
> 4 rows in set (0.00 sec)
>
> Note the number of rows returned from call_notes_text. This matches the
> total number of rows in that table.
That indicates that MySQL takes call_notes_text as the driving table
(the table to begin with) in your join.
I don't have the experience with MySQL here but in general you should
always ask yourself: how big are the result sets from each table in the
join (considering all your where clauses)?
Then it should be clearer which table would be a good driving table. In
your case it's probably call_notes (assuming that ticket_id is a very
selective column (you mentioned the relationship between note_id and
ticket_id); maybe an index on ticket_id would be helpful too).
You should also query your database to get some idea about the
distribution of the data, e.g. select count(*),ticket_id from call_notes
group by ticket_id.
After you have come to a conclusion you just have to teach MySQL to
process your tables in the appropriate order; rephrase your SQL and use
straight join.
HTH
Regards,
Frank.
--
Dr. Frank Ullrich, Netzwerkadministration
Heise Zeitschriften Verlag GmbH & Co KG, Helstorfer Str. 7, D-30625
Hannover
E-Mail: [EMAIL PROTECTED]
Phone: +49 511 5352 587; FAX: +49 511 5352 538
---------------------------------------------------------------------
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