Производительность, связанная с несуществующей функцией

#mysql

#mysql

Вопрос:

У меня есть 2 таблицы a и b, каждая из которых содержит 2 млн и 3,2 млн записей. Я пытаюсь получить те идентификаторы, которые не существуют в b, из a. Я написал запрос ниже,

 select a.id from a where not exists (select b.id from b where a.id =b.id)
  

это занимает больше времени. есть ли лучший способ быстрее получать результаты.

Обновление: я просто изучаю структуру таблицы для обеих таблиц и найденной таблицы a.id имеет десятичный тип данных и таблицу b.id имеет varchar в качестве типа данных

вызовет ли эта разница в типе данных какие-либо проблемы.

Ответ №1:

Не могли бы вы попробовать LEFT JOIN с NULL . Он вернет идентификаторы, которые существуют в TableA и которых нет в TableB.

 SELECT T1.Id
FROM TableA T1
LEFT JOIN TableB T2 ON T2.Id = T1.Id
WHERE T2.Id IS NULL
  

Комментарии:

1. Спасибо за ответ, даже это занимает больше времени. Несмотря на то, что у меня есть индексы в обеих таблицах

Ответ №2:

Хотя вы могли бы написать свой запрос с использованием антисоединения, это, вероятно, не сильно повлияло бы на производительность, и фактически базовый план выполнения мог бы даже быть таким же. Единственный способ ускорить ваш запрос, который я вижу, — это добавить индекс в b таблицу:

 CREATE TABLE idx ON b (id);
  

Но, если b.id быть первичным ключом, то он уже должен быть частью кластеризованного индекса. В этом случае ваша текущая производительность может быть настолько хорошей, насколько вы можете получить.

Комментарии:

1. Спасибо за ответ, таблица a.id имеет первичный ключ и таблицу B, в которой я создал индекс b.id . все еще производительность низкая

2. Насколько велики эти таблицы? Для действительно массивных таблиц любая операция может занять некоторое время.

Ответ №3:

(это в основном комментарий, но он немного длинный)

Пожалуйста, найдите время, чтобы прочитать некоторые из многих вопросов об оптимизации запросов вот ТАК. Те, которые отклонены и закрыты, опускают определения таблиц / индексов и объясняют планы. Те, которые получат положительные голоса, включают их вместе с показателями мощности, производительности и результата.

Соединение с таблицей a в вашем подзапросе является избыточным. Когда вы удаляете вторую ссылку на эту таблицу, вы получаете более простой запрос. Тогда вы можете использовать «не включено» или левое соединение.

Но производительность все равно будет отстойной. Везде, где это возможно, вы должны стараться избегать загонять себя в угол, подобный этому, в вашем дизайне данных.

Ответ №4:

Спасибо за ваши ценные ответы, я нашел способ. Проблема была решена после сохранения тех же типов данных для идентификаторов поиска, результаты получены через 22 секунды.