На стекопоток уже есть ответы на многие вопросы, в которых обсуждается, как 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.