Каждый раз, когда вы применяете функцию к одному или нескольким столбцам таблицы и используете ее в предложении WHERE, индекс не может использоваться.Чтобы получить результат, таблица будет сканироваться сверху вниз.
Вы можете думать об этом как о «вычисленном» столбце.Чтобы оценить сравнение, БД должна «вычислить» столбец, поэтому он больше не является статическим столбцом, существующим в базе данных, а больше похож на переменную.В вашем случае вы объединяете 2 столбца и создаете псевдо столбец.Для вычисляемого столбца индекса не существует, поэтому база данных должна прочитать данные строки, выполнить вычисления и затем оценить сравнение.Если вы посмотрите на запросы, используя EXPLAIN
, то увидите, что эта таблица запросов сканирует все 1 миллион строк.
Согласно комментарию, у вас должен быть индекс для user1, индекс для user2 и запросбудет очень производительным.
Я не знаю приложения, но реализация с именем столбца ('user') и итерацией (user1, user2) обычно указывает на повторяющуюся группу, которая должна была быть нормализована вотношения многие ко многим.
С такой структурой у вас не будет запроса с WHERE user1 = something OR user2 = something
.