It looks like I spoke too soon. That field fix sped up the straight
join, but not the more complex query I had, it's still 0.3 seconds.

SELECT EmailID, EmailUsername, d.DomainName, e.CustID
FROM EmailAddr e, Domain d, CustInfo c
WHERE e.CustID = c.CustID AND e.DomainID = d.DomainID AND
(EmailUsername LIKE '%thompson%')
LIMIT 10;

This explains out like this

Slow (0.3 seconds)
+-------+--------+-----------------+---------+---------+------------+------+-------------+
| table | type   | possible_keys   | key     | key_len | ref
| rows | Extra       |
+-------+--------+-----------------+---------+---------+------------+------+-------------+
| c     | index  | PRIMARY         | PRIMARY |       3 | [NULL]
| 9371 | Using index |
| e     | ref    | DomainID,CustID | CustID  |       3 | c.CustID
|    1 | Using where |
| d     | eq_ref | PRIMARY         | PRIMARY |       2 | e.DomainID
|    1 |             |
+-------+--------+-----------------+---------+---------+------------+------+-------------+

However if I force the index on EmailAddr:

SELECT EmailID, EmailUsername, d.DomainName, e.CustID
FROM EmailAddr e USE INDEX(Primary), Domain d, CustInfo c
WHERE e.CustID = c.CustID AND e.DomainID = d.DomainID AND
(EmailUsername LIKE '%thompson%')
LIMIT 10;

It's fast (0.02 seconds). So it's like Mysql isn't putting the
tables in the right order. Does it have to do with the order I put
the fields/tables in the query? The best way would be for mysql to
do a full table scan for anything that matches that LIKE query...
which should return 8 records, and then join on the CustID. As
opposed to doing the join first and joining 10,000 records, and then
grepping all those.

Fast (0.02 seconds)
+-------+--------+---------------+---------+---------+------------+-------+-------------+
| table | type   | possible_keys | key     | key_len | ref        |
rows  | Extra       |
+-------+--------+---------------+---------+---------+------------+-------+-------------+
| e     | ALL    | [NULL]        | [NULL]  |  [NULL] | [NULL]     |
12413 | Using where |
| d     | eq_ref | PRIMARY       | PRIMARY |       2 | e.DomainID |
    1 |             |
| c     | eq_ref | PRIMARY       | PRIMARY |       3 | e.CustID   |
    1 | Using index |
+-------+--------+---------------+---------+---------+------------+-------+-------------+

Scott

Gleb Paharenko wrote:
> Hello.
> 
> Please, provide the output of EXPLAIN for your queries. The performance
> should improved if you make e.CustID and c.CustID the same type (one of
> them is unsigned). Have you run ANALYZE TABLE on your tables?
> 
> 
> Scott Baker wrote:
>> I have a query that's taking about 0.3 seconds to run and it should
>> be faster I think. I've read all about query optimization and
>> forcing indexes and I'm not entirely sure what I'm having this
>> problem. Google finds all kinds of basic information like using
>> indexes, and not doing math on the query fields. Stupid stuff I'm
>> not doing.
>>
>> I have two tables EmailAddr and CustInfo. That look like this:
>>
>> +------------------+-----------------------+------+-----+---------+
>> | Field            | Type                  | Null | Key | Default |
>> +------------------+-----------------------+------+-----+---------+
>> | EmailID          | mediumint(8) unsigned |      | PRI | NULL    |
>> | EmailUsername    | varchar(25)           | YES  | MUL | NULL    |
>>
>> | EmailPassword    | varchar(50)           | YES  |     | NULL    |
>> | CustID           | mediumint(8) unsigned |      | MUL | 0       |
>>
>> +------------------+-----------------------+------+-----+---------+
>>
>> And
>>
>> +-----------------+-----------------------+------+-----+-----------+
>> | Field           | Type                  | Null | Key | Default   |
>> +-----------------+-----------------------+------+-----+-----------+
>> | CustID          | mediumint(8)          |      | PRI | 0         |
>> | CustAddress     | varchar(150)          | YES  |     | NULL      |
>> | CustCity        | varchar(50)           | YES  |     | NULL      |
>> | CustState       | varchar(50)           | YES  |     | NULL      |
>> | etc...                                                           |
>> +-----------------+-----------------------+------+-----+-----------+
>>
>> Where I select all the records from either table it's 0.02 seconds.
>> There are about 10,000 records in each table. If I try and join the
>> Email table and CustInfo table on CustID (which is in indexed field
>> in both tables) the query time jumps to 0.3 seconds.
>>
>> SELECT EmailID, e.CustID
>> FROM EmailAddr e, CustInfo c
>> WHERE e.CustID = c.CustID;
>>
>> If I tell it to use the index primary it's fast (0.02 seconds)
>>
>> SELECT EmailID, e.CustID
>> FROM EmailAddr e USE INDEX (Primary), CustInfo c
>> WHERE e.CustID = c.CustID;
>>
>> #1) Why can't it find that relationship itself...
>> #2) Why does telling it to use the Primary key for EmailAddr help at
>> all!?! It's not even a query/join field.
>>
>> Scott
> 
> 

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

Reply via email to