Почему MySQL продолжает выбирать индекс столбца "is NULL" вместо индекса столбца "JOIN"? - PullRequest
0 голосов
/ 05 сентября 2018

На стекопоток уже есть ответы на многие вопросы, в которых обсуждается, как SQL выбирает индекс, используя различные статистические данные для таблиц и оценивая, насколько полезным будет каждый индекс. Я надеюсь, что с более конкретным вопросом кто-то сможет пролить свет на то, как это относится к моей ситуации.

Запрос выполняется следующим образом:

SELECT *
FROM TableA
LEFT JOIN TableB
  on TableB.data_id = TableA.data_id
  and TableB.customer_id is NULL
WHERE TableB.id is NULL

Существует индекс для TableB.id и TableB.customer_id. База данных MySQL продолжает использовать индекс на TableB.customer_id. Это заставляет запрос выполняться мучительно медленно, в то время как если я заставлю его использовать индекс на TableB.id, он будет быстрым.

TableA и TableB имеют по 100 000 - 1 000 000 строк и совпадают по многим из них. TableB.customer_id почти все равно NULL.

Есть ли конкретная причина, по которой MySQL выбрал бы индекс для customer_id в этом случае?

Есть ли что-то в предложении is NULL по сравнению с предложением = TableA.id, которое заставляет его думать, что это будет более полезным?

Я бы подумал, что он выберет индекс для id, поскольку это столбец, который сравнивается с другой таблицей, и это столбец, которому нужно конкретное значение, а не просто NULL вместо NOT NULL.

1 Ответ

0 голосов
/ 20 сентября 2018

Индекс на TableB.id не имеет отношения к

 on TableB.data_id = TableA.data_id
and TableB.customer_id is NULL

Вместо этого имейте этот составной индекс:

INDEX(data_id, customer_id)
...