On Dec 20, 2007 7:16 AM, Sharon <[EMAIL PROTECTED]> wrote:
>
> Baron Schwartz wrote:
> > Hi,
> >
> > On Dec 20, 2007 2:15 AM, Sharon <[EMAIL PROTECTED]> wrote:
> >> Hello all,
> >> Given this table:
> >> DROP TABLE IF EXISTS `maprimary`.`tbl_locales_ip2l`;
> >> CREATE TABLE  `maprimary`.`tbl_locales_ip2l` (
> >>    `ipStart` int(10) unsigned zerofill NOT NULL default '0000000000',
> >>    `ipEnd` int(10) unsigned zerofill NOT NULL default '0000000000',
> >>    `countryCode` varchar(2) default NULL,
> >>    `country` varchar(100) default NULL,
> >>    `state` varchar(100) default NULL,
> >>    `city` varchar(120) default NULL,
> >>    `lat` float NOT NULL default '0',
> >>    `lon` float NOT NULL default '0',
> >>    `zipCode` varchar(10) NOT NULL default '0',
> >>    `timeZone` int(10) NOT NULL default '0',
> >>    PRIMARY KEY  USING BTREE (`ipStart`,`ipEnd`)
> >> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
> >>
> >> When I use this query:
> >> SELECT * FROM `tbl_locales_ip2l` WHERE `ipStart` <= 3741319167 AND
> >> `ipEnd` >= 3741319167;
> >> I can see that the primary key is not used and the query takes about 3 sec.
> >> But when I use this query:
> >> SELECT * FROM `tbl_locales_ip2l` WHERE `ipStart` <= 374131916 AND
> >> `ipEnd` >= 374131916;
> >> The primary key is used.
> >> The table contains about 3M rows.
> >> Can anyone explain?
> >> Thanks, Sharon.
> >
> > if the query will access more than a certain amount of rows, it won't
> > be used.  There is a set of heuristics for this; the actual number
> > varies, but people often say a full scan is about as much work as an
> > index scan that retrieves 30% of the rows.  That's not quite the way
> > the optimizer works, but it gives you an idea.
> >
> > If you think it really will be faster, use USE INDEX or FORCE INDEX and see.
> >
> > Baron
>
> You're right, forcing the index results in a 47 sec. query.
> Any idea how to optimize this table?
> 3 seconds query (not forcing the index) is way too slow.

Try InnoDB with the same primary key.  This will cluster the rows
together physically and *might* be faster, but it depends on your
queries.

Side note:  be careful of making the varchar columns larger than you
need, as any operations that use an in-memory temporary table (shown
by "Using temporary" in EXPLAIN) will use the full length of the
column, even if only a few characters are used.  (The Memory storage
engine doesn't support variable-length rows).

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

Reply via email to