Sample Header Ad - 728x90

Why does coalescing make this query quicker?

3 votes
1 answer
182 views
I have the following query SELECT SQL_NO_CACHE table1.* FROM table1 LEFT JOIN table2 ON table2.id = table1.table2_id WHERE (table2.date_assigned >= '2015-06-21') AND ( attempt_1_dateIS NOT NULL OR attempt_2_dateIS NOT NULL OR attempt_3_dateIS NOT NULL ) AND ( attempt_1_date >= '2015-08-16' OR attempt_2_date >= '2015-08-16' OR attempt_3_date >= '2015-08-16' ) AND ( callback_dateIS NULL AND callback_by_account_idIS NULL AND callback_resultIS NULL ) AND ( ( attempt_1_result NOT IN ('complete,incorrect,decline,prospecting') OR attempt_1_result IS NULL ) AND ( attempt_2_result NOT IN ('complete,incorrect,decline,prospecting') OR attempt_2_result IS NULL ) AND ( attempt_3_result NOT IN ('complete,incorrect,decline,prospecting') OR attempt_3_result IS NULL ) ) #AND (table2.date_completed IS NULL) AND (COALESCE(table2.date_completed, '') = '') If I coalesce the date_completed field first, my Database program says the query comes back in 0.000 seconds, yet if I used the above (commented out) line, just checking IS NULL, it takes just over 10 seconds. Both only return the same 5 results. table1 has 24 columns, and ~171,000 rows, and table2 has 172 columns*, and 1.7 million rows. In 1.4 million of those rows, date_completed is null. If you need any more information, just let me know. Few more details I was advised to include: MySQL version: 5.5.41-0ubuntu0.14.04.1-log Explain outputs: **Using COALESCE** id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra 1, 'SIMPLE', 'table1', 'index_merge', 'table2_id,attempt_1_date,attempt_1_result,attempt_2_date,attempt_2_result,attempt_3_date,attempt_3_result', 'attempt_1_date,attempt_2_date,attempt_3_date', '9,9,9', NULL, 8, 'Using sort_union(attempt_1_date,attempt_2_date,attempt_3_date); Using where' 1, 'SIMPLE', 'table2', 'eq_ref', 'PRIMARY,ind_table2_date_assigned', 'PRIMARY', '4', 'database.table1.table2_id', 1, 'Using where' **Using IS NULL** id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra 1, 'SIMPLE', 'table2', 'ref', 'PRIMARY,ind_table2_date_completed,ind_table2_date_assigned', 'ind_table2_date_completed', '9', 'const', 10, 'Using where' 1, 'SIMPLE', 'table1', 'ref', 'table2_id,attempt_1_date,attempt_1_result,attempt_2_date,attempt_2_result,attempt_3_date,attempt_3_result', 'table2_id', '5', 'database.table2.id', 1, 'Using where' Few more notes. * date_completed is type DATETIME * There are no entries where date_completed = '' *120 of those rows relate to 60 questions, in the format question_x_score, and question_x_value
Asked by TMH (199 rep)
Aug 21, 2015, 09:47 AM
Last activity: Aug 1, 2022, 01:04 PM