MySQL имеет тенденцию материализовать подзапросы - это не только накладные расходы на чтение и запись временной таблицы, но также может повлиять на использование индексов в более сложном запросе.
Вот три альтернативных решениякоторые не требуют подзапросов.
Если ?
не содержит подстановочных знаков, то самый простой метод:
replace(replace(col2, '_', ' '), '-', ' ') in (?, ?, ?)
Если это так, измените логику, чтобы использовать один шаблон регулярного выражения:
replace(replace(col2, '_', ' '), '-', ' ') regexp ?
Вы также можете явно настроить шаблон в запросе:
replace(replace(col2, '_', ' '), '-', ' ') regexp
concat('(',
replace(replace(?, '_', '.'), '%', '.*'), ')|(',
replace(replace(?, '_', '.'), '%', '.*'), ')|(',
replace(replace(?, '_', '.'), '%', '.*'), ')'
)