Как ОБНОВИТЬ производительность JOIN в MySQL? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть две таблицы с идентификатором некоторых пользователей

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

UPDATE tableB AS B 
LEFT JOIN tableA AS A ON lower(B.other_id) = lower(A.user_id) 
SET B.found = 1 WHERE A.user_id IS NOT NULL; 

Но когда у меня есть 20 КБ в одной таблице и 10 КБ в другой, иногда этот запрос занимает более 20 минут

У меня есть индексы в обеих таблицах other_id и user_id, эти поля не являются первичными ключами

В объяснении я не вижу этих индексов

1 Ответ

1 голос
/ 30 марта 2019

Это ваш запрос:

UPDATE tableB B LEFT JOIN
       tableA A
       ON lower(B.other_id) = lower(A.user_id) 
    SET B.found = 1
    WHERE A.user_id IS NOT NULL; 

Этот запрос не может использовать ваши индексы. Случаи должны быть одинаковыми в обеих таблицах, поэтому вы обнаружите, что join намного быстрее без lower():

UPDATE tableB B LEFT JOIN
       tableA A
       ON B.other_id = A.user_id
    SET B.found = 1
    WHERE A.user_id IS NOT NULL; 

Если регистр столбцов имеет значение и они не совпадают, то исправьте данные, используя update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...