#mysql
#mysql
Вопрос:
У меня есть запрос, который использует SUBSTRING()
в качестве критерия:
SELECT p.name p_name,
pa.line1 p_line1,
pa.zip p_zip,
c.name c_name,
ca.line1 c_line1,
ca.zip c_zip
FROM bank b
JOIN import_bundle ib ON ib.bank_id = b.id
JOIN generic_import gi ON gi.import_bundle_id = ib.id
JOIN account_import ai ON ai.generic_import_id = gi.id
JOIN account a ON a.account_import_id = ai.id
JOIN account_address aa ON aa.account_id = a.id
JOIN address ca ON aa.address_id = ca.id
JOIN address pa ON pa.zip = ca.zip OR (pa.zip = ca.zip AND pa.line1 = ca.line1)
JOIN prospect p ON p.address_id = pa.id
JOIN customer c ON a.customer_id = c.id
WHERE b.name = 'M'
AND ib.active = 1
AND gi.active = 1
AND SUBSTRING(p.name, 1, 12) = SUBSTRING(c.name, 1, 12)
LIMIT 100
Как вы можете видеть, это просто сравнение первых 12 символов p.name
и c.name
. К сожалению, добавление этого запроса в WHERE
предложение делает мой запрос невыносимо медленным. Существуют ли какие-либо хитрости для проведения такого же сравнения, или мне лучше всего добавить еще один столбец в каждую таблицу, содержащую первые 12 символов имени клиента? Я надеюсь, что это не последнее, потому что это потребовало бы много работы, и в конечном итоге я проведу несколько сравнений, подобных этому.
Комментарии:
1. Из любопытства, как это выполняется с помощью
AND p.name LIKE SUBSTRING(c.name, 1, 12) || '%'
? В любом случае, я думаю, что ваш единственный шанс использовать индексы для обоихp.name
иc.name
— использовать ответ Джима Гаррисона.
Ответ №1:
Добавьте дополнительные столбцы и настройте триггер обновления для их автоматического заполнения. Конечно, не забудьте создать индексы для новых столбцов.