I am using MySQL 5.7.25 and this is the query I am trying to optimize:
SELECT a.contract,
a.phone_number_1,
a.phone_number_2,
a.phone_number_3,
a.phone_number_4,
a.phone_number_5
FROM tempdb.customer_crm a
WHERE CHAR_LENGTH(a.contract) = 12
AND (
a.contract in (SELECT contract_final FROM tempdb.relevant_contracts)
OR a.phone_number_1 in (SELECT phone_number FROM tempdb.relevant_numbers_1)
OR a.phone_number_2 in (SELECT phone_number FROM tempdb.relevant_numbers_2)
OR a.phone_number_3 in (SELECT phone_number FROM tempdb.relevant_numbers_3)
OR a.phone_number_4 in (SELECT phone_number FROM tempdb.relevant_numbers_4)
OR a.phone_number_5 in (SELECT phone_number FROM tempdb.relevant_numbers_5)
);
customer_crm table has 5 different phone numbers in 5 columns. I need to filter all the records where any of the 5 phone numbers exists in table relevant_numbers. I have made 5 copies of table relevant_numbers as I can only use TEMPORARY tables (which cannot be opened more than once in MySQL). The number of records in:
- customer_crm: 80 Million
- relevant_numbers: 63 Thousand
- relevant_contracts: 93 Thousand
- Result of the query: 100 Thousand
This query takes too long. I have shaved off a few minutes using (phone number length condition):
SELECT a.contract,
a.phone_number_1,
a.phone_number_2,
a.phone_number_3,
a.phone_number_4,
a.phone_number_5
FROM tempdb.customer_crm a
WHERE CHAR_LENGTH(a.contract) = 12
AND (
a.contract in (SELECT contract_final FROM tempdb.relevant_contracts)
OR (CHAR_LENGTH(a.phone_number_1) > 9 AND a.phone_number_1 in (SELECT phone_number FROM tempdb.relevant_numbers_1))
OR (CHAR_LENGTH(a.phone_number_2) > 9 AND a.phone_number_2 in (SELECT phone_number FROM tempdb.relevant_numbers_2))
OR (CHAR_LENGTH(a.phone_number_3) > 9 AND a.phone_number_3 in (SELECT phone_number FROM tempdb.relevant_numbers_3))
OR (CHAR_LENGTH(a.phone_number_4) > 9 AND a.phone_number_4 in (SELECT phone_number FROM tempdb.relevant_numbers_4))
OR (CHAR_LENGTH(a.phone_number_5) > 9 AND a.phone_number_5 in (SELECT phone_number FROM tempdb.relevant_numbers_5))
);
It still takes about 10 minutes. I have tried using EXISTS condition instead of IN and it takes even longer. I have also tried using left join which also takes longer. All the columns are individually indexed.
Any help will be appreciated. Thanks.