Here is my table complete schema , i want to get the each category sale count ,
How to get that each category sale count ,
CREATE TABLE IF NOT EXISTS `tblbasket` (
`BID` int(20) NOT NULL
AUTO_INCREMENT,
`BasketSessionID` varchar(100) NOT NULL DEFAULT '0',
`ProductCode` varchar(50) NOT NULL,
`Quantity` int(20) NOT NULL,
`AfterDiscount` double NOT NULL DEFAULT '0',
`ProductCost` double NOT NULL,
`SaleMode` varchar(10) NOT NULL DEFAULT 'p' COMMENT 'p Price f Free',
`BillType` varchar(5) NOT NULL DEFAULT 's' COMMENT 's sale r Returns',
`EntryUser` int(20) NOT NULL,
`EntryTimestamp` int(50) NOT NULL,
`EntryDate` datetime NOT NULL,
`UpdatedUser` int(20) NOT NULL,
`UpdatedDate` datetime NOT NULL,
`Status` int(3) NOT NULL DEFAULT '1',
PRIMARY KEY (`BID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
CREATE TABLE IF NOT EXISTS `tblcategory` (
`CatID` int(11) NOT NULL AUTO_INCREMENT,
`CatName` varchar(20) NOT NULL,
`Discount` int(11) NOT NULL,
`EntryUser` int(10) NOT NULL,
`EntryDate` datetime NOT NULL,
`UpdateUser` int(20) NOT NULL,
`UpdatedDate` datetime NOT NULL,
`Status` int(3) NOT NULL DEFAULT '1',
PRIMARY KEY (`CatID`),
KEY `CatName` (`CatName`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
CREATE TABLE IF NOT EXISTS `tblsale` ( `SaleID` int(20) NOT NULL AUTO_INCREMENT,
`BillNo` varchar(30) NOT NULL DEFAULT '0',
`BasketSessionID` varchar(200) NOT NULL,
`AfterDiscount` double NOT NULL,
`ProductCost` double NOT NULL, `VAT` int(20) NOT NULL DEFAULT '0',
`BillType` varchar(5) NOT NULL DEFAULT 's' COMMENT 'same like tblbasket table',
`EntryUser` int(20) NOT NULL,
`EntryDate` datetime NOT NULL,
`UpdatedUser` int(20) NOT NULL,
`UpdateDate` datetime NOT NULL,
`OfficeNotesTS` text NOT NULL,
`Status` int(5) NOT NULL DEFAULT '1',
PRIMARY KEY (`SaleID`),
UNIQUE KEY `BillNo` (`BillNo`),
UNIQUE KEY `BasketSessionID` (`BasketSessionID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
CREATE TABLE IF NOT EXISTS `tblstock` (
`StockID` int(20) NOT NULL AUTO_INCREMENT,
`ProductCode` varchar(50) NOT NULL,
`ManufacturerID` int(20) NOT NULL,
`CategoryID` int(20) NOT NULL,
`ProductTitle` varchar(150) NOT NULL,
`Timestamp` int(50) NOT NULL,
`EntryUser` int(20) NOT NULL,
`EntryDate` datetime NOT NULL,
`UpdateUser` int(20) NOT NULL,
`UpdatedDate` datetime NOT NULL,
`Status` int(3) NOT NULL DEFAULT '1',
PRIMARY KEY (`StockID`),
KEY `ManufacturerID` (`ManufacturerID`),
KEY `CategoryID` (`CategoryID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2175 ;
CREATE TABLE IF NOT EXISTS `tblstockhistory` (
`STID` int(20) NOT NULL AUTO_INCREMENT,
`StockID` int(20) NOT NULL,
`SupplierID` int(20) NOT NULL,
`InvoiceNO` varchar(20) NOT NULL,
`InvoiceDate` datetime NOT NULL,
`InvoiceAmount` float NOT NULL DEFAULT '0',
`Quantity` int(20) NOT NULL,
`Cost` float NOT NULL,
`MRP` float NOT NULL,
`Discount` int(20) NOT NULL DEFAULT '0',
`VAT` float NOT NULL,
`EntryUser` int(10) NOT NULL,
`EntryDate` datetime NOT NULL,
`UpdateUser` int(20) NOT NULL,
`UpdatedDate` datetime NOT NULL,
`Status` int(10) NOT NULL DEFAULT '1',
PRIMARY KEY (`STID`),
KEY `StockID` (`StockID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2190 ;
ALTER TABLE `tblstock`
ADD CONSTRAINT `tblStock_ibfk_1`
FOREIGN KEY (`ManufacturerID`)
REFERENCES `tblmanufacturer` (`ManufacturerID`);
ALTER TABLE `tblstockhistory`
ADD CONSTRAINT `tblStockHistory_ibfk_1`
FOREIGN KEY (`StockID`)
REFERENCES `tblstock` (`StockID`);
try something like that (its hard to understand without foreign key, and little explain ):
SELECT st.CategoryID,SUM(b.ProductCost*b.Quantity) FROM tblsale s
LEFT JOIN tblbasket b ON b.BasketSessionID = s.BasketSessionID
LEFT JOIN tblstock st ON st.ProductCode = b.ProductCode GROUP BY st.CategoryID
Please scroll down to the "25/08/2010 Update".
I have a query which I have turned into a view. It runs very slowly because (as far as I understand) there are several issues with indexes on the joined tables.
explain select * from view_ed_abc_print
As you can see, I have table "a" using where, temporary and filesort with 4659 rows, which from what I understand means it has to run through 4659 rows for every single row it returns.
I have omitted the query because it is really really long and formats horribly here (it comes from a view so thats causing some issues
Anyone have any ideas?
Thanks for your answers so far. I have created indexes for all the foreign keys and added a primary key to publicationtypes and audittypes tables (oops, that was silly)
Anyway here is the new explain
And this is the where/from part of the query (sorry the formatting get's lost for some reason)
from
(
(
(
(
(
`auau7859_aba`.`ed_abc_publication_audits` `a` use index(pubid)
left join `auau7859_aba`.`public_publications` `p` on
(
(`p`.`pubid` = `a`.`audit_pubid`)
)
)
left join `auau7859_aba`.`ed_aba_frequencies` on
(
(
`auau7859_aba`.`ed_aba_frequencies`.`frequencyid` = `p`.`pub_frequencyid`
)
)
)
left join `auau7859_aba`.`ed_abc_publicationtypes` on
(
(
`auau7859_aba`.`ed_abc_publicationtypes`.`publicationtypeid` = `p`.`pub_type`
)
)
)
left join `auau7859_aba`.`ed_abc_audittypes` on
(
(`a`.`audit_type` = `auau7859_aba`.`ed_abc_audittypes`.`audittypeid`)
)
)
left join `auau7859_aba`.`Members` `m` on((`m`.`MemID` = `p`.`pub_memid`))
) where ((`a`.`audit_active` = 1) and (`p`.`pub_unfinancial` = 0))
order by `a`.`audit_anps` desc
The query time is much better now, however I am wondering if it is possible to get table "a" to start using that key, instead of "Using filesort" which i've read is really slow.
As requested, here are the definition for the relevant tables.
ed_abc_publication_audits
CREATE TABLE `ed_abc_publication_audits` (
`auditid` INT(11) NOT NULL AUTO_INCREMENT,
`audit_period` INT(11) NULL DEFAULT '0',
`audit_year` INT(11) NULL DEFAULT '0',
`audit_pubid` INT(11) NULL DEFAULT '0',
`audit_frequencyid` INT(11) NULL DEFAULT '0',
`audit_issues` VARCHAR(50) NULL DEFAULT NULL,
`audit_exclusions` TINYINT(4) NULL DEFAULT '0',
`deprecated_dayspublished` INT(11) NULL DEFAULT '0',
`audit_specialpublishingday` VARCHAR(50) NULL DEFAULT NULL,
`audit_bumperissues` TINYINT(4) NULL DEFAULT '0',
`audit_bumperissuedates` TEXT NULL,
`audit_bumperissuelinked` TINYINT(4) NULL DEFAULT '0',
`audit_excludeddates` TEXT NULL,
`audit_coverprice` DECIMAL(10,2) NULL DEFAULT '0.00',
`audit_coverpriceday` VARCHAR(100) NULL DEFAULT '0',
`audit_coverprice2` DECIMAL(10,2) NULL DEFAULT '0.00',
`audit_coverprice2day` VARCHAR(100) NULL DEFAULT '0',
`audit_coverprice3` DECIMAL(10,2) NULL DEFAULT '0.00',
`audit_coverprice3day` VARCHAR(100) NULL DEFAULT '0',
`audit_osmoney` INT(11) NULL DEFAULT '0',
`audit_type` INT(11) NULL DEFAULT '0',
`audit_anps` INT(11) NULL DEFAULT '0',
`audit_inexcess` TINYINT(4) NULL DEFAULT '0',
`audit_periodadjustment` TINYINT(4) NULL DEFAULT '0',
`audit_periodadjustmentvalue` INT(11) NULL DEFAULT '0',
`audit_nznps` INT(11) NULL DEFAULT '0',
`audit_nzinexcess` TINYINT(4) NULL DEFAULT '0',
`audit_othercountries` INT(11) NULL DEFAULT '0',
`audit_ocinexcess` TINYINT(4) NULL DEFAULT '0',
`audit_inclaccomairlinesales` DOUBLE NULL DEFAULT '0',
`audit_incleducationalsales` DOUBLE NULL DEFAULT '0',
`audit_incleventsales` DOUBLE NULL DEFAULT '0',
`audit_inclmultiplepublicationsales` DOUBLE NULL DEFAULT '0',
`audit_bundledsales` DOUBLE NULL DEFAULT NULL,
`audit_exclaustraliaother` INT(11) NULL DEFAULT '0',
`audit_exclinexcess` TINYINT(4) NULL DEFAULT '0',
`audit_nimcopiesprinted` INT(11) NULL DEFAULT '0',
`audit_nimcopiesdelivered` INT(11) NULL DEFAULT '0',
`audit_nimcopiesmailed` INT(11) NULL DEFAULT '0',
`audit_remarks` TEXT NULL,
`audit_coverprice4day` INT(10) NULL DEFAULT NULL,
`audit_coverprice4` DECIMAL(10,2) NULL DEFAULT NULL COMMENT 'CoverPrice4',
`audit_issuesaudited` INT(10) NULL DEFAULT NULL,
`audit_nonpublishingdates` VARCHAR(45) NULL DEFAULT NULL,
`audit_digital_anps` INT(10) NULL DEFAULT NULL,
`audit_digital_inclaccomairlinesales` DOUBLE NULL DEFAULT NULL,
`audit_digital_incleducationalsales` DOUBLE NULL DEFAULT NULL,
`audit_digital_incleventsales` DOUBLE NULL DEFAULT NULL,
`audit_digital_inclmultiplepublicationsales` DOUBLE NULL DEFAULT NULL,
`audit_digital_bundledsalesdigital` DOUBLE NOT NULL,
`deprecated_FirstSignatoryName` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_FirstSignatoryEmail` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_SecondSignatoryName` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_SecondSignatoryEmail` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_FormStatus` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_dateSubmitted` VARCHAR(255) NULL DEFAULT NULL,
`audit_datecreated` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`deprecated_dateSignatoryApproved` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_AuditorName` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_AuditorEmail` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_dateAuditorApproved` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_nPeriod` INT(11) NULL DEFAULT NULL,
`deprecated_nYear` INT(10) NULL DEFAULT NULL,
`audit_totalissuesaudited` INT(10) NULL DEFAULT NULL,
`audit_parentpublication` INT(10) NULL DEFAULT NULL,
`audit_auditenddate` VARCHAR(20) NULL DEFAULT NULL,
`audit_digital_bumperissuedates` TEXT NULL,
`audit_digital_bumperissues` TINYINT(4) NULL DEFAULT NULL,
`audit_digital_bumperissueslinked` TINYINT(4) NULL DEFAULT NULL,
`audit_digital_coverprice2` DECIMAL(10,2) NULL DEFAULT NULL,
`audit_digital_coverprice2day` VARCHAR(25) NULL DEFAULT NULL,
`audit_digital_coverprice3` DECIMAL(10,2) NULL DEFAULT NULL,
`audit_digital_coverprice3day` VARCHAR(25) NULL DEFAULT NULL,
`audit_digital_coverprice4` DECIMAL(10,2) NULL DEFAULT NULL,
`audit_digital_coverprice4day` VARCHAR(25) NULL DEFAULT NULL,
`audit_digital_coverprice` DECIMAL(18,2) NULL DEFAULT NULL,
`audit_digital_coverpriceday` VARCHAR(25) NULL DEFAULT NULL,
`audit_daysbetween` INT(11) NULL DEFAULT NULL,
`audit_digital_excludeddates` TEXT NULL,
`audit_digital_issuesaudited` INT(11) NULL DEFAULT NULL,
`audit_digital_issues` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_lodgementstatus` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_lodgementtype` VARCHAR(255) NULL DEFAULT NULL,
`audit_nimaveragecopiesdelivered` INT(11) NULL DEFAULT NULL,
`audit_nimaveragecopiesmailed` INT(11) NULL DEFAULT NULL,
`audit_nimaveragecopiesprinted` INT(11) NULL DEFAULT NULL,
`audit_digital_nonpublishingdates` VARCHAR(45) NULL DEFAULT NULL,
`Remarks` TEXT NULL,
`audit_digital_remarks` TEXT NULL,
`deprecated_s2complete` INT(11) NULL DEFAULT NULL,
`deprecated_s3complete` INT(11) NULL DEFAULT NULL,
`audit_stageid` INT(11) NULL DEFAULT NULL,
`audit_periodenddate` DATE NULL DEFAULT NULL,
`audit_periodstartdate` DATE NULL DEFAULT NULL,
`audit_dayspublished` SET('mon','tue','wed','thu','fri','sat','sun') NULL DEFAULT NULL,
`audit_active` TINYINT(1) UNSIGNED NULL DEFAULT '1',
`deprecated_auditor_name` VARCHAR(255) NULL DEFAULT NULL COMMENT 'abc_status',
`audit_auditor_id` INT(10) NULL DEFAULT NULL COMMENT 'This is the auditor ID that has been pulled from the abc status table. WARNING: THIS IS from abcUSERS',
`deprecated_auditor_email` VARCHAR(255) NULL DEFAULT NULL COMMENT 'abc_status',
`deprecated_publisher_name` VARCHAR(255) NULL DEFAULT NULL COMMENT 'abc_status',
`audit_author_id` INT(10) NULL DEFAULT NULL COMMENT 'the author id from the abc_status. WARNING: ABCUsers TAble, not scmod',
`deprecated_publisher_email` VARCHAR(255) NULL DEFAULT NULL COMMENT 'abc_status',
PRIMARY KEY (`auditid`),
INDEX `pubid` (`audit_pubid`),
INDEX `audit_type` (`audit_type`),
INDEX `audit_periodenddate` (`audit_periodenddate`),
INDEX `audit_periodstartdate` (`audit_periodstartdate`),
INDEX `audit_anps` (`audit_anps`),
INDEX `orderby` (`audit_pubid`, `audit_anps`)
)
COMMENT='aba_cmt'
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=5483
public_publications table (p)
CREATE TABLE `public_publications` (
`pubid` INT(11) NOT NULL AUTO_INCREMENT,
`pub_memid` DOUBLE NULL DEFAULT NULL,
`pub_ledger_code` VARCHAR(255) NULL DEFAULT NULL,
`pub_title` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_previousname` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_tSummaryTitle` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_bBillPublisher` DOUBLE NULL DEFAULT NULL,
`deprecated_bBillOtherMember` DOUBLE NULL DEFAULT NULL,
`deprecated_BillMemID` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_BBillAdHocAddress` DOUBLE NULL DEFAULT NULL,
`pub_address` VARCHAR(255) NULL DEFAULT NULL,
`pub_suburb` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_state1` VARCHAR(255) NULL DEFAULT NULL,
`pub_mlocation` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_postcode` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_membership_amount` DOUBLE NULL DEFAULT NULL,
`deprecated_receipt_date` VARCHAR(255) NULL DEFAULT NULL,
`pub_abc` DOUBLE NULL DEFAULT NULL,
`pub_unfinancial` TINYINT(1) NULL DEFAULT '0',
`pub_auditmemid` DOUBLE NULL DEFAULT NULL,
`deprecated_auditorid` DOUBLE NULL DEFAULT NULL,
`pub_audittype` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_PubType` DOUBLE NULL DEFAULT NULL,
`pub_classification` INT(11) NULL DEFAULT NULL,
`deprecated_OldPubID` DOUBLE NULL DEFAULT NULL,
`deprecated_OldCompanyID` DOUBLE NULL DEFAULT NULL,
`pub_contactid` DOUBLE NULL DEFAULT NULL,
`pub_auditremarks` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_bGovernment` DOUBLE NULL DEFAULT NULL,
`deprecated_bExGovernment` DOUBLE NULL DEFAULT NULL,
`deprecated_dDateJoined` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_tDaysPublished` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_stateid` VARCHAR(50) NULL DEFAULT NULL,
`deprecated_PublisherCost` DOUBLE NULL DEFAULT NULL,
`pub_magazinecategory` DOUBLE NULL DEFAULT NULL,
`deprecated_dayspublished` DOUBLE NULL DEFAULT NULL,
`pub_frequency` VARCHAR(255) NULL DEFAULT NULL,
`pub_type` INT(11) NULL DEFAULT NULL,
`pub_subtype` VARCHAR(255) NULL DEFAULT NULL,
`deprecated_MYOBExport` DOUBLE NULL DEFAULT NULL,
`deprecated_periodJAN-JUNE` DOUBLE NULL DEFAULT NULL,
`deprecated_periodJUL-DEC` DOUBLE NULL DEFAULT NULL,
`deprecated_periodJAN-MAR` DOUBLE NULL DEFAULT NULL,
`deprecated_periodAPR-JUN` DOUBLE NULL DEFAULT NULL,
`deprecated_periodJUL-SEPT` DOUBLE NULL DEFAULT NULL,
`deprecated_periodOCT-DEC` DOUBLE NULL DEFAULT NULL,
`deprecated_periodApr-Mar` DOUBLE NULL DEFAULT NULL,
`deprecated_periodOct-Sept` DOUBLE NULL DEFAULT NULL,
`deprecated_UnfinancialDate` VARCHAR(255) NULL DEFAULT NULL,
`pub_location` VARCHAR(255) NULL DEFAULT NULL,
`Address` VARCHAR(255) NULL DEFAULT NULL COMMENT 'Address',
`deprecated_AuditorName` VARCHAR(255) NULL DEFAULT NULL COMMENT 'use pub_auditorid instead. ',
`deprecated_AuditorEmail` VARCHAR(255) NULL DEFAULT NULL COMMENT 'use pub_auditorid instead. ',
`pub_auditflag` VARCHAR(45) NULL DEFAULT NULL,
`pub_datemodified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`pub_website` VARCHAR(255) NULL DEFAULT NULL,
`pub_mastheadurl` VARCHAR(255) NULL DEFAULT NULL,
`pub_frequencyid` INT(11) NULL DEFAULT NULL,
`pub_nimparentpubid` INT(11) NULL DEFAULT NULL,
`pub_active` TINYINT(4) NULL DEFAULT NULL,
`remove_datemodified` TIMESTAMP NULL DEFAULT NULL,
`pub_datecreated` TIMESTAMP NULL DEFAULT NULL,
`pub_dayspublished` SET('mon','tue','wed','thu','fri','sat','sun') NULL DEFAULT NULL,
`pub_state` VARCHAR(10) NULL DEFAULT NULL,
`pub_contact_vote` INT(10) NULL DEFAULT NULL,
`pub_contact_auditletter1` INT(10) NULL DEFAULT NULL,
`pub_contact_auditletter2` INT(10) NULL DEFAULT NULL,
`pub_auditorid` INT(10) NULL DEFAULT NULL COMMENT 'Put the user id of the auditor in this field for ABC elodgement. (see sc_module_users user_id, listed in the module > users page in edata backend)',
`pub_next_audit_period` INT(10) NULL DEFAULT NULL,
`pub_next_audit_type` INT(10) NULL DEFAULT NULL,
PRIMARY KEY (`pubid`),
INDEX `Index_2` (`pub_title`),
INDEX `Unfinancial` (`pub_unfinancial`),
INDEX `lPublicationType` (`pub_type`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=20000
Members (m) table
CREATE TABLE `Members` (
`MemID` INT(11) NOT NULL AUTO_INCREMENT,
`ABC` INT(11) NOT NULL,
`Mem_Type_ID` SMALLINT(6) NOT NULL,
`Membership Status` VARCHAR(80) NULL DEFAULT NULL,
`reference` VARCHAR(255) NULL DEFAULT NULL,
`CABReference` VARCHAR(50) NULL DEFAULT NULL,
`Company_Name` VARCHAR(255) NOT NULL,
`Street_Address` VARCHAR(255) NULL DEFAULT NULL,
`Street_Address_Line2` VARCHAR(100) NULL DEFAULT NULL,
`Suburb` VARCHAR(255) NULL DEFAULT NULL,
`State` VARCHAR(255) NULL DEFAULT NULL,
`Post_Code` VARCHAR(255) NULL DEFAULT NULL,
`unfinancial` TINYINT(1) NULL DEFAULT NULL,
`file` VARCHAR(255) NULL DEFAULT NULL,
`Phone` VARCHAR(255) NULL DEFAULT NULL,
`Fax` VARCHAR(255) NULL DEFAULT NULL,
`WebsiteAddress` VARCHAR(70) NULL DEFAULT NULL,
`TempAddress` VARCHAR(255) NULL DEFAULT NULL,
`ABCWebsitePassword` VARCHAR(10) NULL DEFAULT NULL,
`ABCWebsiteUsername` VARCHAR(10) NULL DEFAULT NULL,
`CABWebsiteUsername` VARCHAR(10) NULL DEFAULT NULL,
`CABWebsitePassword` VARCHAR(10) NULL DEFAULT NULL,
`MembershipAmount` DOUBLE NULL DEFAULT NULL,
`MYOBExport` TINYINT(1) NULL DEFAULT NULL,
`MYOBTaxCode` VARCHAR(3) NULL DEFAULT NULL,
`Date_Last_Payment` VARCHAR(40) NULL DEFAULT NULL,
`Date_Admitted` VARCHAR(40) NULL DEFAULT NULL,
`Date_Resigned` VARCHAR(40) NULL DEFAULT NULL,
`masthead_url` VARCHAR(255) NULL DEFAULT NULL,
`masthead_report` TINYINT(1) NULL DEFAULT '0',
`masthead_image` VARCHAR(255) NULL DEFAULT NULL,
`masthead_description` TEXT NULL,
`masthead_title` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`MemID`),
INDEX `MemID` (`MemID`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=12349
As for the other tables, they are fairly irrelevant, although happy to post them if you think they are relevant, just comment on it.
Thanks. Here is the latest explain query result:
And a quick summary
Added indexes to All foreign keys and added primary keys to publicationtypes and audittypes tables (these are just lookup tables)
Added an index on the sort for public_publications and publications_audit table
these have greatly decreased the query time, but it still runs in about 0.4 seconds, and there's only a total of around 4300 rows.
Any advice you have would be greatly appreciated!
25/08/2010 Update
After a bit more debugging, I realise that if I remove all the guff from my select clause that the query runs quite fast. Now I am wondering if there is something within my select clause that is making it run so slow.
Can anyone point out some slowness to do with this select query:
`p`.`pub_memid` AS `pub_memid`,
`a`.`audit_inexcess` AS `audit_inexcess`,
`a`.`auditid` AS `auditid`,
`a`.`audit_period` AS `audit_period`,
year(`a`.`audit_periodenddate`) AS `audit_year`,
`p`.`pub_unfinancial` AS `pub_unfinancial`,
`p`.`pub_title` AS `pub_title`,
concat(`p`.`pub_title`,_latin1'{%}',`p`.`pubid`) AS `pub_title#display`,
`p`.`pubid` AS `pubid`,
`a`.`audit_periodstartdate` AS `audit_periodstartdate`,
date_format(`a`.`audit_periodstartdate`,_latin1'%b %y') AS `audit_periodstartdate#display`,
`a`.`audit_periodenddate` AS `audit_periodenddate`,
date_format(`a`.`audit_periodenddate`,_latin1'%b %y') AS `audit_periodenddate#display`,
`a`.`audit_type` AS `audit_type`,
`auau7859_aba`.`ed_abc_audittypes`.`audittype_title` AS `audittype_title`,
`p`.`pub_state` AS `pub_state`,
`p`.`pub_location` AS `pub_location`,
`p`.`pub_dayspublished` AS `pub_dayspublished`,
`auau7859_aba`.`ed_aba_frequencies`.`frequency_title` AS `frequency_title`,
`a`.`audit_issues` AS `audit_issues`,
`a`.`audit_issuesaudited` AS `audit_issuesaudited`,
if(((`a`.`audit_exclusions` <> 0) or (`a`.`audit_bumperissues` <> 0)),concat(_utf8'*',`a`.`audit_issuesaudited`),`a`.`audit_issuesaudited`) AS `audit_issuesaudited#display`,
`a`.`audit_coverprice` AS `audit_coverprice`,
concat(_utf8'$',`a`.`audit_coverprice`) AS `audit_coverprice#display`,
`a`.`audit_coverpriceday` AS `audit_coverpriceday`,
date_format(`a`.`audit_periodenddate`,_latin1'%b %y') AS `period_ending`,
`a`.`audit_remarks` AS `audit_remarks`,
`p`.`pub_type` AS `pub_type`,
`auau7859_aba`.`ed_abc_publicationtypes`.`publicationtype_title` AS `publicationtype_title`,
`a`.`audit_anps` AS `audit_anps`,
if(`a`.`audit_inexcess`,concat(_utf8'+',format(`a`.`audit_anps`,0)),format(`a`.`audit_anps`,0)) AS `audit_anps#display`,
if((`a`.`audit_inclaccomairlinesales` > 0),concat(format((`a`.`audit_inclaccomairlinesales` * 100),2),_utf8'%'),_utf8'') AS `audit_inclaccomairlinesales#display`,
if((`a`.`audit_incleducationalsales` > 0),concat(format((`a`.`audit_incleducationalsales` * 100),2),_utf8'%'),_utf8'') AS `audit_incleducationalsales#display`,
if((`a`.`audit_incleventsales` > 0),concat(format((`a`.`audit_incleventsales` * 100),2),_utf8'%'),_utf8'') AS `audit_incleventsales#display`,
if((`a`.`audit_inclmultiplepublicationsales` > 0),concat(format((`a`.`audit_inclmultiplepublicationsales` * 100),2),_utf8'%'),_utf8'') AS `audit_inclmultiplepublicationsales#display`,
if((`a`.`audit_bundledsales` > 0),concat(format((`a`.`audit_bundledsales` * 100),2),_utf8'%'),_utf8'') AS `audit_bundledsales#display`,
if((`a`.`audit_nznps` > 0),format(`a`.`audit_nznps`,0),_utf8'') AS `audit_nznps#display`,
if((`a`.`audit_othercountries` > 0),format(`a`.`audit_othercountries`,0),_utf8'') AS `audit_othercountries#display`,
if((`a`.`audit_exclaustraliaother` > 0),format(`a`.`audit_exclaustraliaother`,0),_utf8'') AS `audit_exclaustraliaother#display`,
`a`.`audit_inclaccomairlinesales` AS `audit_inclaccomairlinesales`,
`a`.`audit_incleducationalsales` AS `audit_incleducationalsales`,
`a`.`audit_incleventsales` AS `audit_incleventsales`,
`a`.`audit_inclmultiplepublicationsales` AS `audit_inclmultiplepublicationsales`,
`a`.`audit_bundledsales` AS `audit_bundledsales`,
`a`.`audit_nznps` AS `audit_nznps`,
`a`.`audit_othercountries` AS `audit_othercountries`,
`a`.`audit_exclaustraliaother` AS `audit_exclaustraliaother`,
`p`.`pub_mastheadurl` AS `pub_mastheadurl`,
`a`.`auditid` AS `audit_mastheadlink`,
concat(ifnull(`a`.`audit_bumperissuedates`,_latin1''),_latin1'{%}',ifnull(`a`.`audit_excludeddates`,_latin1''),_latin1'{%}',ifnull(`a`.`audit_remarks`,_latin1'')) AS `audit_remarks#display`,
if((ifnull(`a`.`audit_specialpublishingday`,_latin1'') <> _latin1''),concat(ifnull(`p`.`pub_dayspublished`,_latin1''),_latin1'{%}',ifnull(`a`.`audit_specialpublishingday`,_latin1'')),`p`.`pub_dayspublished`) AS `pub_dayspublished#display`,
`a`.`audit_parentpublication` AS `audit_parentpublication`,
if((ifnull(`p`.`pub_nimparentpubid`,0) > 0),(select `nimpub`.`pub_title` AS `pub_title` from `auau7859_aba`.`public_publications` `nimpub` where (`nimpub`.`pubid` = `p`.`pub_nimparentpubid`)),_latin1'') AS `audit_parentpublication#display`,
`a`.`audit_digital_anps` AS `audit_digital_anps`,
if((`a`.`audit_digital_anps` > 0),format(`a`.`audit_digital_anps`,0),_utf8'') AS `audit_digital_anps#display`,
`a`.`audit_digital_bumperissuedates` AS `audit_digital_bumperissuedates`,
`a`.`audit_digital_bumperissues` AS `audit_digital_bumperissues`,
`a`.`audit_digital_bumperissueslinked` AS `audit_digital_bumperissueslinked`,
`a`.`audit_digital_coverprice` AS `audit_digital_coverprice`,
concat(_utf8'$',`a`.`audit_digital_coverprice`) AS `audit_digital_coverprice#display`,
`a`.`audit_digital_coverprice2` AS `audit_digital_coverprice2`,
`a`.`audit_digital_coverprice2day` AS `audit_digital_coverprice2day`,
`a`.`audit_digital_coverprice3` AS `audit_digital_coverprice3`,
`a`.`audit_digital_coverprice3day` AS `audit_digital_coverprice3day`,
`a`.`audit_digital_coverprice4` AS `audit_digital_coverprice4`,
`a`.`audit_digital_coverprice4day` AS `audit_digital_coverprice4day`,
`a`.`audit_digital_coverpriceday` AS `audit_digital_coverpriceday`,
`a`.`audit_digital_excludeddates` AS `audit_digital_excludeddates`,
`a`.`audit_digital_inclaccomairlinesales` AS `audit_digital_inclaccomairlinesales`,
if((`a`.`audit_digital_inclaccomairlinesales` > 0),concat(format(`a`.`audit_digital_inclaccomairlinesales`,2),_utf8'%'),_utf8'') AS `audit_digital_inclaccomairlinesales#display`,
`a`.`audit_digital_incleducationalsales` AS `audit_digital_incleducationalsales`,
if((`a`.`audit_digital_incleducationalsales` > 0),concat(format(`a`.`audit_digital_incleducationalsales`,2),_utf8'%'),_utf8'') AS `audit_digital_incleducationalsales#display`,
`a`.`audit_digital_incleventsales` AS `audit_digital_incleventsales`,
if((`a`.`audit_digital_incleventsales` > 0),concat(format(`a`.`audit_digital_incleventsales`,2),_utf8'%'),_utf8'') AS `audit_digital_incleventsales#display`,
`a`.`audit_digital_inclmultiplepublicationsales` AS `audit_digital_inclmultiplepublicationsales`,
if((`a`.`audit_digital_inclmultiplepublicationsales` > 0),concat(format(`a`.`audit_digital_inclmultiplepublicationsales`,0),_utf8'%'),_utf8'') AS `audit_digital_inclmultiplepublicationsales#display`,
`a`.`audit_digital_bundledsalesdigital` AS `audit_digital_bundledsalesdigital`,
if((`a`.`audit_digital_bundledsalesdigital` > 0),concat(format(`a`.`audit_digital_bundledsalesdigital`,2),_utf8'%'),_utf8'') AS `audit_digital_bundledsalesdigital#display`,
`a`.`audit_digital_issues` AS `audit_digital_issues`,
`a`.`audit_digital_issuesaudited` AS `audit_digital_issuesaudited`,
if(((ifnull(`a`.`audit_digital_excludeddates`,_latin1'') <> _latin1'') or (`a`.`audit_digital_bumperissues` <> 0)),concat(_utf8'*',`a`.`audit_digital_issuesaudited`),`a`.`audit_digital_issuesaudited`) AS `audit_digital_issuesaudited#display`,
`a`.`audit_digital_nonpublishingdates` AS `audit_digital_nonpublishingdates`,
`a`.`audit_digital_remarks` AS `audit_digital_remarks`,
concat(ifnull(`a`.`audit_digital_bumperissuedates`,_latin1''),_latin1'{%}',ifnull(`a`.`audit_digital_excludeddates`,_latin1''),_latin1'{%}',ifnull(`a`.`audit_digital_remarks`,_latin1'')) AS `audit_digital_remarks#display`,
`m`.`Company_Name` AS `publisher`,
`auau7859_aba`.`ed_abc_publicationtypes`.`publicationtype_abbreviation` AS `publicationtype_abbreviation`
More of a detailed question...
From what I'm reading in the query, you are doing all left joins ... thus indicating all records from the left side table, regardless of there being a match in the right-side table based on its join. In this case, the inner most from...
ed_abc_publication_audits left-joined to public_publications
yet your where clause is qualifying a value on BOTH sides via
(a.audit_active = 1) and (p.pub_unfinancial = 0)
To me, that would imply an INNER JOIN where the record MUST exist on each side...
You then do LEFT JOINs to auau7859_aba.ed_aba_frequencies, ed_abc_publicationtypes, ed_abc_audittypes and Members....
Are you expecting some non-matches at these deeper level joins and thus expecting NULL values, or is what you want is where they ALL ultimately join together at all levels.
HOWEVER, it looks like the left joins to the other tables are more of a lookup/reference table where the record should ALWAYS exist.. Such as
Each publication audit will ALWAYS have a valid "Audit Type"
Each publication will ALWAYS have a "Frequency ID", "Type of Publication" and "Member"
Is this correct in my interpretation??? The lookup tables will ALWAYS have matching record? If so, which ones... if Optional which ones...
Based on your answers, try the following query... The STRAIGHT_JOIN can be powerful if you know your data, relationships and can optimize on your own which is the key table driving the rest of the system...
SELECT STRAIGHT_JOIN
a.*,
p.*
FROM
auau7859_aba.ed_abc_publication_audits a
left join auau7859_aba.ed_abc_audittypes atypes
ON a.audit_type = atypes.audittypeid,
auau7859_aba.public_publications p
left join auau7859_aba.ed_aba_frequencies f
ON p.pub_frequencyid = f.frequencyid
left join auau7859_aba.ed_abc_publicationtypes t
ON p.pub_type = t.publicationtypeid
left join auau7859_aba.Members m
on p.pub_memid = m.MemID
where
a.audit_pubid = p.pubid
and a.Audit_Active = 1
and p.pub_unfinancial = 0
Sorting and fetching that amount of records should not be a problem for MySQL.
As I can see from your print screen not all tables have indexes. Create Index for each field that involved with JOIN or WHERE statements. And overall performance should increase.
If you want to avoid the filesort, put the fields in your ORDER BY in an index you can use.
In your case, a.audit_anps isn't available in an index, so the filesort kicks in. Put an index on (pubid, audit_anps) and it will do what you want.
Be mindful when adding indexes, though; each index will have to be updated on every write to, so simply throwing indices around may result in beautiful EXPLAINs but horrible app-performance. Remember: EXPLAIN only tells you what the optimizer does with your query and a given set of tables and indexes. It can help you achieve good app performance, but a nice looking EXPLAIN is not your real goal.
To get the value for audit_parentpublication#display, it's doing a query on auau7859_aba.public_publications for every row.
Try modifying your main query to outer join auau7859_aba.public_publications instead.