views:

154

answers:

4

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

alt text


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?


Hi Guys,

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 alt text

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'm 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 guys, Here's the latest explain query result alt text

And a quick summary 1. Added indexes to All foreign keys and added primary keys to publicationtypes and audittypes tables (these are just lookup tables) 2. 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

Hey Guys, 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'm 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`
A: 

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.

Nazariy
Joining using a function--IE `UPPER(a.col) = UPPER(b.col)`--will not use a index if there is one on `a.col` or `b.col`...
OMG Ponies
+1  A: 

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
DRapp
Hey D-Rapp... that's good advice, you make a good point.I changed the join to an inner join and added the condition to the join itself, like so:`auau7859_aba`.`ed_abc_publication_audits` `a` inner join `auau7859_aba`.`public_publications` `p` on ( (`p`.`pubid` = `a`.`audit_pubid` and pub_unfinancial=0) )The query time went from 0.437 to 0.156, a massive improvement. Answers to your question below
Jason
The query def works like this:Publications have many Circulations, some publications are not valid (unfinancial, i know the naming is so stupid, sorry i didn't design that). All circulations relate to one publication. These are the main two tables. The rest of the tables are simply, as you mentioned, lookup tables. and if they don't have a value then they can just return null, as they do.So your interpretation is correct. required tables are: Publications / Circulations. optional tables: Audit Type, Frequency, publication type and Members.
Jason
Hey D-Rap, that query works well, i never knew about straight joins so I'm reading up about them now.This hasn't solved my problem, but it's brought me much closer. I realise now, your query doesn't use the filesort when I run it (btw it runs well, good work!) but as soon as I add my select clause to it, it goes back to being slow as a dog. So I think I need to post my select clause and get advice on what is making it so slow...
Jason
@Jason When you add WHAT select clause to it...
DRapp
A: 

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.

CharString
Hi CharString,I've added an index of orderby(audit_Pubid, Audit_anps)it is still doing the filesort though:|| *id* || *select_type* || *table* || *type* || *possible_keys* || *key* || *key_len* || *ref* || *rows* || *Extra* |||| 2 || DERIVED || a || ALL || pubid,orderby || _NULL_ || _NULL_ || _NULL_ || 4659 || Using filesort ||I went a bit crazy and then added audit_anps, audit_pubid to indexes as well. Still no dice with this. The query is still running too slow. Thank you so much for your help, I feel like we are close but not there yet.
Jason
Look I totally understand that updates will take much longer, but to be honest this data changes only 4 times per year. It's worth the trade of in update speed if I can get this query going. I'm going to post some more details in the question.
Jason
A: 

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.

grossvogel