In the last episode (Jun 08), Ying Lu said:
> By the way, I am using 4.0.18-log on i686.linux2.6.10.
> >I did the following two explain select ... According to whether I put 
> >the single quotation mark or not, I will get totally different results:
> >
> >1. Without single quotation mark:
> >
> >explain SELECT * FROM test T1 force index (idx_test) WHERE  *T1.STUDID = 
> >0999999 AND T1.Prog_link = 6666*;
> >+-------+--------+---------------+---------+---------+------+-------+-------------+
> >| table | type   | possible_keys | key     | key_len | ref  | rows  | Extra  
> >     |
> >+-------+--------+---------------+---------+---------+------+-------+-------------+
> >| T1    | ALL    | idx_test      | NULL    |    NULL | NULL | 91230 | Using 
> >where |
> >+-------+--------+---------------+---------+---------+------+-------+-------------+

This is a numeric comparison, so it has to convert STUDID to a number
to compare.  If you have 3 rows with the following STUDIDs, they will
all match: "0999999", "999999", " 999999".  It can't do index lookups
on all possible string values that convert to 999999, so it does a full
table scan.

> >2. With single quotation mark:

> >explain SELECT * FROM test T1 force index (idx_test) WHERE  T1.STUDID = 
> >'0999999' AND T1.Prog_link = '6666';
> >+-------+--------+---------------+----------+---------+-------+------+-------------+
> >| table | type   | possible_keys | key      | key_len | ref   | rows | Extra 
> >      |
> >+-------+--------+---------------+----------+---------+-------+------+-------------+
> >| T1    | ref    | idx_test      | idx_test |       7 | const |   27 | Using 
> >where |
> >+-------+--------+---------------+----------+---------+-------+------+-------------+

Here you're doing a string comparison, so only the exact value
"0999999" can match.  It can use the index to look up the matching rows
directly.

> >Note:  . create index idx_test on test(studid, prog_link);
> >          . in test table, studid is varchar(7), prog_link is varchar(4).

Solution:  either convert your columns to INTEGER, or use string
comparisons and ensure that the fields have a consistent format.

-- 
        Dan Nelson
        [EMAIL PROTECTED]

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

Reply via email to