I have this query, which works fine, except it takes a couple of minutes to load. I need help optimizing it so it runs faster and I don't know where to start:
SELECT
job_header.job,
job_header.suffix,
job_header.customer,
job_header.description,
job_header.comments_1,
job_header.date_due,
job_header.part,
job_header.customer_po,
job_header.date_closed,
job_header.flag_hold,
job_header.code_sort,
wo_user_flds.user_7,
wo_user_flds.user_3,
wo_user_flds.user_6,
wo_user_flds.user_5,
wo_user_flds.user_2,
quote_lines.user_2 as serialNo,
quote_lines.user_3 as unit,
quote_lines.user_4 as package
FROM job_header
LEFT JOIN wo_user_flds ON
(job_header.job = wo_user_flds.job) AND
(job_header.suffix = wo_user_flds.suffix)
LEFT JOIN quote_lines ON
(job_header.part = quote_lines.part)
WHERE job_header.date_closed = '000000'
AND LENGTH(job_header.job) > 5;
More information that might be of use:
I could speculate on what I think I need to do, but I'm really just guessing at this point. I looked at similar questions and lot of talk of 'indexes', so I checked and these tables do have some indexes...if that helps? Thanks in advance.
[EDIT]
Thanks for the quick responses guys, really appreciate it. I'm going to look into everything everyone said, but here is the ddl for these tables: http://paste.ubuntu.com/13247664/
[EDIT 2]
My query takes 1 minute to load. My expectations may not be realistic in how much faster it can be. I might have to resort to breaking up the query into more than one and then just assemble the data on the client.
The following recommendations will help you in your SQL tuning process.
You'll find 3 sections below:
ALTER TABLE `job_header` ADD INDEX `job_header_idx_date_closed_length_job` (`date_closed`,`length_job`);
ALTER TABLE `quote_lines` ADD INDEX `quote_lines_idx_part` (`part`);
ALTER TABLE `wo_user_flds` ADD INDEX `wo_flds_idx_job_suffix` (`job`,`suffix`);
SELECT
job_header.job,
job_header.suffix,
job_header.customer,
job_header.description,
job_header.comments_1,
job_header.date_due,
job_header.part,
job_header.customer_po,
job_header.date_closed,
job_header.flag_hold,
job_header.code_sort,
wo_user_flds.user_7,
wo_user_flds.user_3,
wo_user_flds.user_6,
wo_user_flds.user_5,
wo_user_flds.user_2,
quote_lines.user_2 AS serialNo,
quote_lines.user_3 AS unit,
quote_lines.user_4 AS package
FROM
job_header
LEFT JOIN
wo_user_flds
ON (
job_header.job = wo_user_flds.job
)
AND (
job_header.suffix = wo_user_flds.suffix
)
LEFT JOIN
quote_lines
ON (
job_header.part = quote_lines.part
)
WHERE
job_header.date_closed = '000000'
AND job_header.length_job > 5