In the last episode (Jul 11), Leonardo Leonardo said:
> On Sun, Jul 11, 2010 at 7:07 PM, Leonardo Leonardo 
> <new2mys...@gmail.com>wrote:
> > Here is the structure of the Table T1 ( ENGINE=InnoDB ) -
> >
> >   `c1` varchar(128) NOT NULL default '',
> >   `c2` int(11) NOT NULL default '0',
> >   `c3` varchar(32) NOT NULL default '',
> >   `c4` blob,
> >   `c5` double default NULL,
> >   `c6` varchar(255) default NULL,
> >   `c7` enum('BLOB','NUMERIC','STRING') NOT NULL default 'BLOB',
> >   KEY `key1` (`c1`,`c2`,`c3`,`c5`),
> >   KEY `key2` (`c1`,`c2`,`c3`,`c6`),
> >
> > The query is as below -
> > SELECT * FROM T1 WHERE (c1 = '$string1' AND c2 IN ($int1, $int2 , $int3,
> > $int4 , $int5, $int6 , $int7 , $int8, $int9, $int10 ))
> >
> > Mysql is choosing key1 & key2 in different situations .

InnoDB estimates index cardinality on every query by examining a few random
disk blocks in each index.  Depending on which pages are examined, mysql
might decide one index is better then the other even if everything else is
the same.  Try running EXPLAIN SELECT on the same query a few times and see
if the optimizer picks different indexes.  If you're running a new enough
version of mysql (5.1.38 or newer), you can change the
innodb_stats_sample_pages variable to raise the number of pages from the
default of 8 (try 16).  That will make the estimate more accurate and
hopefully mysql will pick the right index consistently.

  
http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_stats_sample_pages

Another solution might be to create another index on (c1,c2), since that
index is the most efficient one for your particular query.  MySQL will
always pick that index over the other two.

-- 
        Dan Nelson
        dnel...@allantgroup.com

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql?unsub=arch...@jab.org

Reply via email to