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]