Более быстрая альтернатива SUBSTRING() в MySQL?

#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:

Добавьте дополнительные столбцы и настройте триггер обновления для их автоматического заполнения. Конечно, не забудьте создать индексы для новых столбцов.