EXPLAIN output is a good way to see how MySQL is planning to execute your query - which indexes it chooses to use, how much work it thinks it needs to do for each table reference.

My understanding is that you can get an approximate / rough idea of operations needed by multiplying all the 'rows' columns in the EXPLAIN output. For you, that's
54 * 9 * 69 * 1 * 65 * 1 * 2 * 1 * 65 * 1 * 24 = 6800695200

which is obviously a lot of operations.

Your state table may not have an index on the column you are joining on. Try adding one there. (Don't see your 'state' table def here to check).

What does your CPU usage look like while this query is running? And what does 'SHOW PROCESSLIST' tell you while this query is running?

Dan



Jesse wrote:
Thanks for the help. Just so you know, I stated in the original message that the tables are InnoDB, but I've since converted them to MyISAM to see if that helped. It didn't. Here's the information you wanted:

Here are the table structures:

CREATE TABLE `members` (
 `ID` int(10) NOT NULL,
 `ChapterID` int(10) default NULL,
 `FirstName` varchar(25) character set utf8 default NULL,
 `MI` varchar(1) character set utf8 default NULL,
 `LastName` varchar(25) character set utf8 default NULL,
 `UID` varchar(15) character set utf8 default NULL,
 `MemberType` varchar(20) character set utf8 default NULL,
 `InvoiceNo` varchar(7) character set utf8 default NULL,
 `PayDate` datetime default NULL,
 `MembershipExpires` datetime default NULL,
 `NLCEligible` tinyint(1) NOT NULL default '1',
 `PayNatDues` tinyint(1) NOT NULL default '1',
 `GPA` decimal(18,2) default NULL,
 `GradYear` int(10) default NULL,
 `Gender` varchar(1) character set utf8 default NULL,
 `BusEdCourse` varchar(40) character set utf8 default NULL,
 `AddDate` datetime default NULL,
 `PhotoID` smallint(5) default NULL,
 PRIMARY KEY  (`ID`),
 KEY `IX_Members` (`LastName`,`FirstName`,`MI`),
 KEY `IX_Members_1` (`UID`),
 KEY `IX_Members_2` (`InvoiceNo`),
 KEY `IX_Members_3` (`ChapterID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE `chapters` (
 `ID` int(10) NOT NULL,
 `SchoolID` int(10) default NULL,
 `Name` varchar(50) character set utf8 default NULL,
 `ChapterType` varchar(25) character set utf8 default NULL,
 `UID` varchar(8) character set utf8 default NULL,
 `NextMemNo` int(10) default NULL,
 `Males` int(10) default NULL,
 `Females` int(10) default NULL,
 `AfricanAmerican` int(10) default NULL,
 `Asian` int(10) default NULL,
 `Caucasian` int(10) default NULL,
 `Hispanic` int(10) default NULL,
 `NativeAmerican` int(10) default NULL,
 `Other` int(10) default NULL,
 `Grade6` int(10) default NULL,
 `Grade7` int(10) default NULL,
 `Grade8` int(10) default NULL,
 `Grade9` int(10) default NULL,
 `Grade10` int(10) default NULL,
 `Grade11` int(10) default NULL,
 `Grade12` int(10) default NULL,
 `Freshmen` int(10) default NULL,
 `Sophomore` int(10) default NULL,
 `Junior` int(10) default NULL,
 `Senior` int(10) default NULL,
 `PostGraduate` int(10) default NULL,
 `AgeBelow22` int(10) default NULL,
 `Age22_25` int(10) default NULL,
 `Age26_30` int(10) default NULL,
 `Age31_40` int(10) default NULL,
 `AgeOver40` int(10) default NULL,
 `Disabilities` int(10) default NULL,
 `EducationallyDisabled` int(10) default NULL,
 `EconomicallyDisadvantaged` int(10) default NULL,
 `LimitedEnglishProficiency` int(10) default NULL,
 `NonTraditional` int(10) default NULL,
 `TempInvNo` varchar(7) character set utf8 default NULL,
 `MatSentDate` datetime default NULL,
 `TransferDate` datetime default NULL,
 `AddDate` datetime default NULL,
 `Reactivated` tinyint(1) default NULL,
 `OverrideNLCHotel` tinyint(1) NOT NULL default '0',
 PRIMARY KEY  (`ID`),
 KEY `IX_Chapters` (`UID`),
 KEY `IX_Chapters_1` (`SchoolID`),
 KEY `IX_Chapters_2` (`ChapterType`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE `schools` (
 `ID` int(10) NOT NULL,
 `Name` varchar(50) character set utf8 default NULL,
 `Address` varchar(50) character set utf8 default NULL,
 `City` varchar(30) character set utf8 default NULL,
 `State` varchar(2) character set utf8 default NULL,
 `Sub` varchar(2) character set utf8 default NULL,
 `Zip` varchar(10) character set utf8 default NULL,
 `BOContact` varchar(35) character set utf8 default NULL,
 `BOAddress` varchar(40) character set utf8 default NULL,
 `BOCity` varchar(30) character set utf8 default NULL,
 `BOState` varchar(2) character set utf8 default NULL,
 `BOZip` varchar(10) character set utf8 default NULL,
 `BOPhone` varchar(13) character set utf8 default NULL,
 `Phone` varchar(15) character set utf8 default NULL,
 `Ext` varchar(10) character set utf8 default NULL,
 `Fax` varchar(15) character set utf8 default NULL,
 `Region` varchar(10) character set utf8 default NULL,
 `District` varchar(10) character set utf8 default NULL,
 `InvoiceRequired` tinyint(1) default '0',
 `PrincipalsName` varchar(50) default NULL,
 `PrincipalsEMail` varchar(65) default NULL,
 PRIMARY KEY  (`ID`),
 KEY `IX_Schools` (`Name`),
 KEY `IX_Schools1` (`State`,`Sub`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE `advchapterlink` (
 `ID` int(10) NOT NULL,
 `AdvisorID` int(10) default NULL,
 `ChapterID` int(10) default NULL,
 `Rank` int(10) default NULL,
 `Primary` tinyint(1) NOT NULL default '0',
 `AllowToEdit` tinyint(1) NOT NULL default '1',
 PRIMARY KEY  (`ID`),
 KEY `IX_AdvChapterLink` (`AdvisorID`,`ChapterID`),
 KEY `IX_AdvChapterLink_1` (`ChapterID`,`AdvisorID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE `localadvisors` (
 `ID` int(10) NOT NULL,
 `FirstName` varchar(30) character set utf8 default NULL,
 `LastName` varchar(35) character set utf8 default NULL,
 `ChapterID` int(10) default NULL,
 `Address` varchar(50) character set utf8 default NULL,
 `City` varchar(30) character set utf8 default NULL,
 `State` varchar(2) character set utf8 default NULL,
 `Sub` varchar(2) character set utf8 default NULL,
 `Zip` varchar(10) character set utf8 default NULL,
 `EMailAddress` varchar(50) character set utf8 default NULL,
 `HomePhone` varchar(15) character set utf8 default NULL,
 `WorkPhone` varchar(15) character set utf8 default NULL,
 `WorkExt` varchar(10) character set utf8 default NULL,
 `CellPhone` varchar(15) character set utf8 default NULL,
 `UserName` varchar(50) character set utf8 default NULL,
 `FirstTimeIn` tinyint(1) NOT NULL default '1',
 `Fax` varchar(15) character set utf8 default NULL,
 `FaxPermission` tinyint(1) NOT NULL default '1',
 `EMailPermission` tinyint(1) NOT NULL default '1',
 `ContactType` varchar(20) character set utf8 default NULL,
 `InvoiceNo` varchar(7) character set utf8 default NULL,
 `PayDate` datetime default NULL,
 `StartService` int(10) default NULL,
 PRIMARY KEY  (`ID`),
 KEY `IX_LocalAdvisors` (`LastName`,`FirstName`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

EXPLAIN returned several rows of information:

1, 'PRIMARY', 'ST', 'ALL', 'IX_State', '', '', '', 54, 'Using temporary; Using filesort' 1, 'PRIMARY', 'S', 'ref', 'PRIMARY,IX_Schools1', 'IX_Schools1', '9', 'bpa.ST.State', 69, 'Using where' 1, 'PRIMARY', 'C', 'ref', 'IX_Chapters_1', 'IX_Chapters_1', '5', 'bpa.S.ID', 1, 'Using where' 3, 'DEPENDENT SUBQUERY', 'S2', 'ref', 'PRIMARY,IX_Schools1', 'IX_Schools1', '18', 'bpa.S.State,bpa.S.Sub', 65, 'Using where' 3, 'DEPENDENT SUBQUERY', 'C2', 'ref', 'PRIMARY,IX_Chapters_1,IX_Chapters_2', 'IX_Chapters_1', '5', 'bpa.S2.ID', 1, 'Using where' 3, 'DEPENDENT SUBQUERY', 'ACL', 'ref', 'IX_AdvChapterLink,IX_AdvChapterLink_1', 'IX_AdvChapterLink_1', '5', 'bpa.C2.ID', 2, 'Using where; Using index' 3, 'DEPENDENT SUBQUERY', 'LA', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'bpa.ACL.AdvisorID', 1, 'Using where' 2, 'DEPENDENT SUBQUERY', 'S1', 'ref', 'PRIMARY,IX_Schools1', 'IX_Schools1', '18', 'bpa.S.State,bpa.S.Sub', 65, 'Using where' 2, 'DEPENDENT SUBQUERY', 'C1', 'ref', 'PRIMARY,IX_Chapters_1,IX_Chapters_2', 'IX_Chapters_1', '5', 'bpa.S1.ID', 1, 'Using where' 2, 'DEPENDENT SUBQUERY', 'M', 'ref', 'IX_Members_3', 'IX_Members_3', '5', 'bpa.C1.ID', 24, 'Using where; Using index'

Not sure what all that means, but there it is.

Now, as for the other stuff. I'm running MySQL version 5.0.15-nt. I'm running on my development machine, which is a Dell Demension 3000. It's running a Pentium 4 2.8 GHz CPU with 1 GB of RAM, with Windows XP Pro.

Thanks,
Jesse

----- Original Message ----- From: "Dan Buettner" <[EMAIL PROTECTED]>
To: "Jesse" <[EMAIL PROTECTED]>
Cc: "MySQL List" <mysql@lists.mysql.com>
Sent: Monday, June 26, 2006 5:21 PM
Subject: Re: Query Speed


Jesse, can you post table structures ( SHOW CREATE TABLE tablename )
and the output you get from EXPLAIN followed by the query below?

Also what version of MySQL you're on, and high level details of the hardware (RAM, disks, processors, OS).

That will all be helpful in trying to help you out here.

Dan


Jesse wrote:
I have a query which I can execute in Microsoft SQL, and it's instantaneous. However, In MySQL, I've only been able to get it down to 48 seconds:

SELECT S.State, ST.StateName, S.Sub, C.ChapterType, (SELECT Count(*) FROM (Members M JOIN Chapters C1 ON C1.ID=M.ChapterID) JOIN Schools S1 on S1.ID=C1.SchoolID WHERE S1.State=S.State AND S1.Sub=S.Sub AND C1.ChapterType=C.ChapterType) AS TotMem, (SELECT Count(*) FROM ((AdvChapterLink ACL JOIN LocalAdvisors LA ON LA.ID=ACL.AdvisorID) JOIN Chapters C2 ON C2.ID=ACL.ChapterID) JOIN Schools S2 ON S2.ID=C2.SchoolID WHERE S2.State=S.State AND S2.Sub=S.Sub AND C2.ChapterType=C.ChapterType AND LA.InvoiceNo IS NOT NULL) AS TotAdv
FROM (Chapters C JOIN Schools S ON S.ID=C.SchoolID)
   JOIN State ST ON S.State=ST.State
GROUP BY S.State, ST.StateName, S.Sub, C.ChapterType
ORDER BY S.State, S.Sub, C.ChapterType

I have added indexes to make sure that all of the JOINs and WHEREs can operate efficiently. This helped tremendously, as my first attempt at this query timed out, so I have no idea how long it would have actually taken. I'm doing this query using ASP on a Windows XP Pro machine, however, doing it in the MySQL Query Browser takes just as long (as one would expect). The tables are all InnoDB. Is there anything else I can do to help speed this query up?

Thanks,
Jesse


--
Dan Buettner




--
Dan Buettner

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

Reply via email to