Hi Gabriel,
No, the order of the WHERE clause shouldn't have anything to do with how
the query is executed. The only exception may be if MySQL thinks 2
different ways of doing something are of equal cost. In that case it may
choose one or the other depending on how the query is written.
Matt
----- Original Message -----
From: "Gabriel Ricard"
Sent: Wednesday, November 12, 2003 10:00 AM
Subject: Re: Dirt Slow Query On Datetime Range...the saga continues
> In order to make sure of a multi-column index, you have to order the
> WHERE clauses in the same order as the columns in the index. Since you
> query Realm first, then AcctStartTime, then AcctStopTime, MySQL would
> use an index on those columns in that order. You can either add a
> differently ordered index of the same columns or not, just make sure
> your query has the columns in the right order.
>
> - Gabriel
>
> On Tuesday, November 11, 2003, at 05:57 PM, Michael Shuler wrote:
>
> > Thanks for the quick help everyone...OK I made a few changes....
> >
> > The Query is now:
> > SELECT COUNT( * ) AS CallCount FROM ServiceRADIUSAccounting WHERE
> > (Realm =
> > 'testrealm.com') AND ('2003-10-11 16:00:00' BETWEEN AcctStartTime
AND
> > AcctStopTime)
> > Which uses the RealmAndStart index (which as you see in the next
line
> > has
> > been improved slightly).
> >
> > And I modified the last key to:
> > KEY `RealmAndStart` (`Realm`,`AcctStartTime`,`AcctStopTime`)
> >
> > I also though about it for a while and had an inspirational idea
that
> > if I
> > make a key that looks like this:
> > KEY `StartStopRealm` (`AcctStartTime`,`AcctStopTime`,`Realm`)
> >
> > It would go even faster because it will narrow down to the records
> > within
> > the time frame (which is about 1000 records) and then down by the
> > realm name
> > which would result in ~150 records to count. Oddly enough in the
> > EXPLAIN it
> > doesn't even consider it as a possible index to use. What gets even
> > more
> > odd is that I swapped the BETWEEN and the Realm in the WHERE clause
> > and then
> > it decided to use just the plain Realm index...
> >
> > SELECT COUNT( * ) AS CallCount FROM ServiceRADIUSAccounting WHERE
> > ('2003-10-11 16:00:00' BETWEEN AcctStartTime AND AcctStopTime) AND
> > (Realm =
> > 'testrealm.com')
> >
> >
> > Is this a bug and is there a way to force MySQL to use an index that
> > you
> > know is a better choice?
> >
> > Thanks again,
> > Michael Shuler
> >
> >
> > -----Original Message-----
> > From: Michael Shuler [mailto:[EMAIL PROTECTED]
> > Sent: Tuesday, November 11, 2003 3:44 PM
> > To: [EMAIL PROTECTED]
> > Subject: Dirt Slow Query On Datetime Range
> >
> >
> > OK, I give up. To anyone out there who can help me, please explain
why
> > this
> > query runs slower than dirt. The table has about 1,300,000 records
in
> > it,
> > which is not supposed to be a big deal for MySQL to deal with. I
have
> > tried
> > it with MyISAM and then changed it to InnoDB which made it even
slower
> > but
> > at least the rest of my queries can continue and not be blocked.
This
> > query
> > takes 30 seconds on a dual 1GHz 1GB RAM RedHat 9 PC. In my opinion
it
> > should be 10x faster than that at the very least.
> >
> > This table is used for RADIUS accounting, all I want to do is find
the
> > peak
> > utilization port utilization for the day. The only way I have
figured
> > out
> > how to do this is take samples every 5 min and store the highest
one.
> > Here
> > is the table:
> >
> > CREATE TABLE `ServiceRADIUSAccounting` (
> > `RadAcctId` bigint(21) NOT NULL auto_increment,
> > `AcctSessionId` varchar(32) NOT NULL default '',
> > `AcctUniqueId` varchar(32) NOT NULL default '',
> > `UserName` varchar(64) NOT NULL default '',
> > `Realm` varchar(64) default '',
> > `NASIPAddress` varchar(15) NOT NULL default '',
> > `NASPortId` int(12) default NULL,
> > `NASPortType` varchar(32) default NULL,
> > `AcctStartTime` datetime NOT NULL default '0000-00-00 00:00:00',
> > `AcctStopTime` datetime NOT NULL default '0000-00-00 00:00:00',
> > `AcctSessionTime` int(12) default NULL,
> > `AcctAuthentic` varchar(32) default NULL,
> > `ConnectInfo_start` varchar(32) default NULL,
> > `ConnectInfo_stop` varchar(32) default NULL,
> > `XmitSpeed` varchar(6) default NULL,
> > `RecvSpeed` varchar(6) default NULL,
> > `AcctInputOctets` int(12) default NULL,
> > `AcctOutputOctets` int(12) default NULL,
> > `CalledStationId` varchar(11) NOT NULL default '',
> > `CallingStationId` varchar(11) NOT NULL default '',
> > `AcctTerminateCause` varchar(32) NOT NULL default '',
> > `ServiceType` varchar(32) default NULL,
> > `FramedProtocol` varchar(32) default NULL,
> > `FramedIPAddress` varchar(15) NOT NULL default '',
> > `AcctStartDelay` int(12) default NULL,
> > `AcctStopDelay` int(12) default NULL,
> > PRIMARY KEY (`RadAcctId`),
> > KEY `UserName` (`UserName`),
> > KEY `FramedIPAddress` (`FramedIPAddress`),
> > KEY `AcctSessionId` (`AcctSessionId`),
> > KEY `AcctUniqueId` (`AcctUniqueId`),
> > KEY `AcctStartTime` (`AcctStartTime`),
> > KEY `AcctStopTime` (`AcctStopTime`),
> > KEY `NASIPAddress` (`NASIPAddress`),
> > KEY `Realm` (`Realm`),
> > KEY `RealmAndStart` (`Realm`,`AcctStartTime`)
> > ) TYPE=InnoDB AUTO_INCREMENT=4468368 ;
> >
> >
> > And here is the query:
> >
> > SELECT COUNT(*) AS CallCount FROM ServiceRADIUSAccounting WHERE
(Realm
> > =
> > 'testreal.com') AND (AcctStartTime <= '2003-11-11 15:30:00' AND
> > AcctStopTime
> >> = '2003-11-11 15:30:00')
> >
> > When I do an explain I get:
> > table type possible_keys
> > key key_len ref rows Extra
> > ServiceRADIUSAccounting ref
> > AcctStartTime,AcctStopTime,Realm,RealmAndStart RealmAndStart 65
> > const
> > 73394 Using where
> >
> > Perhapse my InnoDB file needs to be "optimized" if such a thing
> > exists. I
> > don't know why this takes so long but I can definitly use some help.
> > Thanks!
> >
> > ----------------------------------------
> >
> > Michael Shuler
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]